R
Robert Klemme
Schüle Daniel said:Hello,
below is one little script that fails at ### <<< line
the output is
Animal has properties
Animal will be speakable
Dog has properties
Dog will be speakable
Duck has properties
Duck will be speakable
./dort.rb:16:in `speak': undefined local variable or method `msg' for
#<Dog:0x401d8da0> (NameError)
from ./dort.rb:44
I would think that (passed to function) local variable msg would be
"closed" in self.class_eval {} closure and therefor be accessable
can someone point out why it doesn't work?
Regards, Daniel
#!/usr/bin/env ruby
$prop = {}
def prop
puts "#{self.name} has properties"
self.class_eval do
$prop[self] = []
end
end
def speakable(msg)
puts "#{self.name} will be speakable"
self.class_eval do
$prop[self] << "I can speak"
def speak;msg;end ### <<<
end
end
class Animal
prop
speakable "..."
def whatCanIDo;$prop[self.class];end
def self.whatCanIDo;$prop[self];end
end
class Dog < Animal
prop
speakable "wuff"
end
class Duck < Animal
prop
speakable "quak"
end
a = Dog.new
b = Duck.new
puts a.speak, b.speak
Without looking too close at your code: def has special scoping rules.
You better try to use define_method:
def speakable(msg)
class_eval do
# ...
define_methodspeak) msg end
end
end
HTH
Btw, what are you trying to accomplish? Somehow I have the feeling that
your code might be more complex than needed. Especially the use of a
global variable irritates me.
Kind regards
robert