Hello,
I’m trying to write a code similar to the below:
class Module
def foo(*names)
for name in names
class_eval do
define_method(name) do
puts name
end
end
end
end
end
class Goo
foo :a, :b, :c
end
I was expecting to
bar = Goo.new
bar.a prints ‘a’, bar.b prints ‘b’, and bar.c prints ‘c’. But all
methods prints ‘c’. Why?
Thanks!
On Fri, 31 Mar 2006, [email protected] wrote:
end
I was expecting to
bar = Goo.new
bar.a prints ‘a’, bar.b prints ‘b’, and bar.c prints ‘c’. But all
methods prints ‘c’. Why?
Thanks!
harp:~ > cat a.rb
class Module
def foo(*names)
names.each do |name|
class_eval{ define_method(name){ name } }
end
end
end
class Goo
foo :a, :b, :c
end
goo = Goo.new
p goo.a
p goo.b
p goo.c
harp:~ > ruby a.rb
:a
:b
:c
it has to do with the difference between ‘for’ and ‘each’ - search the
archives
for ‘decoux for each’.
basically your method block was bound to a non-block local variable that
was
cycled a->b->c - finally existing as c. with ‘each’ you get a block
local
moral. never use ‘for’
hth.
-a