--0016369fa10aacf64004b0347681
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

2011/10/26 Jesús Gabriel y Galán <jgabrielygalan / gmail.com>

> On Wed, Oct 26, 2011 at 4:04 PM, Marc Heiler <shevegen / linuxmail.org>
> wrote:
> > Given is a small .rb file.
> >
> > In that .rb file, class Array is modified and a convenience
> > method is added.
> >
> > class Array
> >
> >  def rand
> >
> > I want to limit this modification to only that specific
> > .rb file though.
> >
> > When I use that .rb file in a larger project, I do not want
> > the modification of class Array to leak out into other .rb
> > files. Is there a way to limit the scope of the modification?
> >
> > Of course I can define a method simply and call that, but:
> >
> >  array.rand
> >
> > Looks better to my eyes than:
> >
> >  rand(array)
> >
> > So I would prefer to be able to do only the array.rand.
>
> One solution would be to create a module with the rand method, and
> extend only the arrays you use in that .rb:
>
> # small.rb
>
> module Randomizable
>  def rand
>     # your implentation
>  end
> end
>
> some_elements = [1,2,3,4,5]
> some_elements.extend(Randomizable)
> some_elements.rand
>
> All other arrays in the system will not be affected.
>
> Jesus.
>


I think an equivalent way is to directly open the singleton class of a
(what extend is doing in your implementation).

peterv@ASUS:~$ irb
001:0> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
002:0> class << a
003:1> def rand
004:2> self.sort_by!{|e| Kernel.rand} # without the Kernel reference,
infinite loop is created
005:2> end
006:1> end
=> nil
007:0> a.rand
=> [4, 1, 5, 3, 2]
008:0> b = [6,7,8,9,10]
=> [6, 7, 8, 9, 10]
009:0> Array.methods.grep(/rand/)
=> []
010:0> a.methods.grep(/rand/)
=> [:rand]
011:0> b.methods.grep(/rand/)
=> []

HTH,

Peter

--0016369fa10aacf64004b0347681--