On Aug 15, 8:44 pm, William James <w_a_x_... / yahoo.com> wrote:
> On Aug 14, 6:51 am, "Robert Klemme" <shortcut... / googlemail.com>
> 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'd
> > rather not do it that way, i.e. without changing the array at hand.You
> > can use inject for that.
>
> > I'd use #inject for your problem:
>
> > match = [a,b].map {|x| File.expand_path(x).downcase}.inject {|x,y| x==y}
>
> match = [a,b].map {|x| File.expand_path(x).downcase}.uniq.size == 1

Very nice.

  nikolai