How do I get constants defined by Ruby's Module class via reflection?

前端 未结 2 849
时光说笑
时光说笑 2020-12-24 01:31

I was trying to get Matz and Flanagan\'s \"Ruby Programming Language\" metaprogramming chapter into my head, However I couldn\'t understand the output from the following cod

2条回答
  •  悲&欢浪女
    2020-12-24 01:54

    I had to go back into my thinking cave for a while after Marc's response. Tinkered with more code snippets and then some more. Finally when Ruby's method resolution seemed to make sense wrote it down as a blog post so that I don't forget.

    Notation: If A" is the eigenclass of A

    When A.constants is called, method resolution (refer to the image in my blog post to have a visual aid) looks up the following locations in order

    • MyClass", Object", BasicObject" (singleton methods)
    • Class (instance methods)
    • Module (instance methods)
    • Object (instance methods) and Kernel
    • BasicObject (instance methods)

    Ruby finds the instance method Module#constants

    When Module.constants is called, Ruby looks at

    • Module", Object", BasicObject" (singleton methods)
    • Class (instance methods)
    • Module (instance methods)
    • Object (instance methods) and Kernel
    • BasicObject (instance methods)

    this time, Ruby finds the singleton/class method at Module".constants as Marc said.

    Module defines a singleton method which shadows the instance method. The singleton method returns all known constants whereas the instance method returns the constants defined in current class and its ancestors.

提交回复
热议问题