Why?


#1

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

##############

Help Me^^

##############


#2

On Oct 22, 2:50 am, Kyung won Cheon removed_email_address@domain.invalid wrote:

=> nil

How is ‘why?’ inherited???

Help Me^^

##############

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.


#3

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.

HTH,
Sebastian


#4

On Oct 22, 7:25 am, Sebastian H. removed_email_address@domain.invalid
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.

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.