After some more thought, the rule that instance methods go into the
lexically enclosing class has surprised me again. Let x = []. I had
thought that the following two methods behaved identically (except for
"foo vs bar", of course):
def x.define_foo
def foo ; "foo" ; end
end
class << x
def define_bar
def bar ; "bar" ;end
end
end
However, in the first case the lexically enclosing class is Object
(well, you know what I mean), and in the second case the lexically
enclosing class is the singleton class of x. So the rule says
(correctly) that the two are different:
x.define_foo
Object.instance_methods.include? "foo" # true
x.singleton_methods.include? "foo" # false
x.define_bar
Object.instance_methods.include? "bar" # false
x.singleton_methods.include? "bar" # true
Good!, I think. But there is still one case where I don't know where
the "def" should go:
x.instance_eval { def baz ; "baz" ; end }
What class acts as the effective enclosing class of the def? Is it
Object, the actual enclosing class? Or Array, the class of x? Or
is it the singleton class of x? The answer is the latter:
x.singleton_methods.include? "baz" # true
Whew!
--
Posted via http://www.ruby-forum.com/.