Robert Klemme
3/4/2007 7:35:00 PM
On 04.03.2007 14:59, Martin Boese wrote:
> I'd like to define methods on initialize that are specific for the created
> object. However it seems that the few lines of code below is defining them
> somewhere else since they are 'overwriting' each other:
>
> ============
> class Foo
> def initialize(method_name, &block)
> self.class.send(:define_method, method_name, &block)
> end
> end
>
> aa = Foo.new(:whoareyou) { puts "I am aa" }
> bb = Foo.new(:whoareyou) { puts "I am bb" }
>
> aa.whoareyou
> # returns: "I am bb" - But I expect: "I am aa"
> bb.whoareyou
> # returns: "I am bb"
>
> Foo.whoareyou
> # undefined method ===> Good
> ============
Note, you do not necessarily need instance methods in this case:
irb(main):001:0> Foo = Struct.new :whoareyou
=> Foo
irb(main):002:0> aa = Foo.new "I am aa"
=> #<struct Foo whoareyou="I am aa">
irb(main):003:0> bb = Foo.new "A am bb"
=> #<struct Foo whoareyou="A am bb">
irb(main):004:0> aa.whoareyou
=> "I am aa"
irb(main):005:0> bb.whoareyou
=> "A am bb"
Kind regards
robert