The toplevel object (aka 'main') delegates some module-equivalent
methods to Object class. So when you say
def why?
end
What actually happens is:
class Object
def why?
end
private :why?
end
Not all module methods are delegated, try using define_method(:why?)
at the toplevel instead and it will bomb.
T.
P.S. Personally, I find the whole setup rather half-baked, and have
continually advocated for the replacement of the current toplevel
object with a self extended module.
···
On Oct 22, 2:50 am, Kyung won Cheon <kdrea...@gmerce.co.kr> wrote:
## in irb
>> self
=> main
>> def why?
>> end
=> nil
>> self.why?
=> nil
## in test.rb
p self # => main
def why?
end
self.why? # private method 'why?' called for main:Object
(NoMethodError)
## Anyway, one more..
## in test2.rb
def why?
end
class A
end
p A.private_method_defined?(:why?) # true
# How is 'why?' inherited???
# The 'main' is a instance of Object but it's not a Object?
# I understand if ...
# class Object
# private
# def why?
# end
# end
The toplevel object (aka 'main') delegates some module-equivalent
methods to Object class.
As far as I'm aware it "delegates" only alias, undef, def, module and class.
So it only delegates keywords, not methods. Which is, I assume, why def works
and define_method (which is a method) does not.
HTH,
Sebastian
···
--
NP: Die Apokalyptischen Reiter - Wir Hoffen
Jabber: sepp2k@jabber.org
ICQ: 205544826
Good point. I never really looked at like that b/c I tend to think of
keywords as syntax sugar for real methods.
class -> Class.new
def -> define_method
alias -> alias_method
etc.
Conditionals are an exception, of course.
But it sort of begs the question, why does it support the one and not
the other?
T.
···
On Oct 22, 7:25 am, Sebastian Hungerecker <sep...@googlemail.com> wrote:
Trans wrote:
> The toplevel object (aka 'main') delegates some module-equivalent
> methods to Object class.
As far as I'm aware it "delegates" only alias, undef, def, module and class.
So it only delegates keywords, not methods. Which is, I assume, why def works
and define_method (which is a method) does not.