Singleton aliases

N

Nikolay Pavlov

Hello all.
I have a class with instance method "each" and i want to add variable
aliases for it based on some preferences of the generated objects.
Did some one know how i can achieve this?
 
P

Phrogz

I have a class with instance method "each" and i want to add variable
aliases for it based on some preferences of the generated objects.

class Foo
def each
p "each called for #{self}"
yield
end
end

f1 = Foo.new

def f1.some(&block)
each(&block)
end

f1.each{ p 'hi!' }
#=> "each called for #<Foo:0x7ffa72cc>"
#=> "hi!"

f1.some{ p 'aliased' }
#=> "each called for #<Foo:0x7ffa72cc>"
#=> "aliased"


f2 = Foo.new
class << f2
alias_method :yow, :each
end

f2.yow{ p 'simpler' }
#=> "each called for #<Foo:0x7ffa6e30>"
#=> "simpler"
 
W

Wilson Bilkovich

Hello all.
I have a class with instance method "each" and i want to add variable
aliases for it based on some preferences of the generated objects.
Did some one know how i can achieve this?

This is one way. There are several.
I am assuming you mean that only that particular instance should have
this method, and not other instances of the same class.

metaclass = class << self;self;end
sym = :some_name_you_generated
metaclass.send :alias_method, sym, :each

More traditionally, this is usually a good place to consider using
inheritance. :)
 
P

Phrogz

I have a class with instance method "each" and i want to add variable
aliases for it based on some preferences of the generated objects.

Adding one more option to my last post:

class Foo
def each
p "each called for #{self}"
yield
end
end

f1 = Foo.new

def f1.some(&block)
each(&block)
end

f1.each{ p 'hi!' }
#=> "each called for #<Foo:0x7ffa72cc>"
#=> "hi!"

f1.some{ p 'aliased' }
#=> "each called for #<Foo:0x7ffa72cc>"
#=> "aliased"


f2 = Foo.new
class << f2
alias_method :yow, :each
end

f2.yow{ p 'simpler' }
#=> "each called for #<Foo:0x7ffa6e30>"
#=> "simpler"

module BonkerTime
def go_bonkers( &block ); each( &block ); end
end

f3 = Foo.new
f3.extend( BonkerTime )
f3.go_bonkers{ p "w00t" }
#=> "each called for #<Foo:0x7ffa6908>"
#=> "w00t"
 
N

Nikolay Pavlov

This is one way. There are several.
I am assuming you mean that only that particular instance should have
this method, and not other instances of the same class.

metaclass = class << self;self;end
sym = :some_name_you_generated
metaclass.send :alias_method, sym, :each

More traditionally, this is usually a good place to consider using
inheritance. :)

Wow. Thanks for all suggestions. But that one was really helpful and simple
to me and i've come up to this implementation:

def singleton_alias(alias_name, name)
klass = class << self; self; end
klass.send :alias_method, alias_name.to_sym, name.to_sym
end
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,264
Messages
2,571,323
Members
48,006
Latest member
MelinaLema

Latest Threads

Top