nikolai.weibull@gmail.com
8/14/2007 2:28:00 PM
On Aug 14, 2:07 pm, dbl...@rubypal.com wrote:
> Hi --
>
>
>
> On Tue, 14 Aug 2007, Robert Klemme wrote:
> > 2007/8/14, nikolai.weib...@gmail.com <nikolai.weib...@gmail.com>:
> >> Hi!
>
> >> I wanted to write a simple method for comparing two paths on a Windows
> >> system. My initial algorithm felt very contrived:
>
> >> def same_path?(a, b)
> >> a, b = [a, b].map{ |p| File.expand_path(p).downcase }
> >> a == b
> >> end
>
> >> It felt like saving the result from #map and then doing the comparison
> >> shouldn't be necessary. So I came up with the following solution:
>
> >> class Array
> >> def apply(method)
> >> shift.send(method, *self)
> >> end
> >> end
>
> >> This allowed me to define #same_path? thusly:
>
> >> def same_path?(a, b)
> >> [a, b].map{ |p| File.expand_path(p).downcase }.apply(:==)
> >> end
>
> >> which, to me, looks a lot nicer. Array#apply takes a method (in a
> >> symbolic manner) and applies it to its first element, passing the rest
> >> of the elements as arguments to the given method.
>
> >> Any thoughts? Is Array#apply a method that could potentially have
> >> other uses than my specific example above?
>
> > Your method should be called "apply!" because it's destructive.
>
> I could be wrong, but I think the convention (at least in core Ruby)
> is that ! methods always come in a pair with the non-! version. I
> don't think there are any cases where there's just a method called m!
> where the ! indicates destructiveness (or other "danger"). All the
> unpaired destructive methods have non-! names.
Ugh. This was so NOT about whether to call the method Array#apply or
Array#apply!. I just wrote the absolute shortest solution I could
think of. I didn't suggest that it was the final version. Yes,
seeing as how my definition mutates its target, Array#apply! is the
appropriate name. I simply didn't want to clutter the definition
thusly:
class Array
def apply(method)
first.send(method, *self[1..-1])
end
end
(which sort of begs the question why we don't have Array#rest ;-)
nikolai