Ruby什么类在没有明确的接收器时获取方法?

ant*_*ano 4 ruby methods

随机问题在这里.我不确定是否有这个术语,但我想知道你何时定义一个没有显式接收器的方法,你怎么知道哪个类得到了这个方法?是不是self在这种情况下是什么?

self 在类定义的上下文中是定义的类,使用隐式接收器定义的方法绑定到类,我们一直看到它.

但是,如果我在实例方法中定义一个方法,那么'sub_method'也会被放在外部类中:

[12] pry(main)> class A
[12] pry(main)*   def my_method
[12] pry(main)*     puts self
[12] pry(main)*     def sub_method
[12] pry(main)*       puts self
[12] pry(main)*     end  
[12] pry(main)*   end  
[12] pry(main)* end  
=> :my_method
[13] pry(main)> a = A.new
=> #<A:0x007fa588181d40>
[14] pry(main)> a.my_method
#<A:0x007fa588181d40>
=> :sub_method
[15] pry(main)> a.sub_method
#<A:0x007fa588181d40>
=> nil
[16] pry(main)> A.instance_methods(false)
=> [:my_method, :sub_method]
Run Code Online (Sandbox Code Playgroud)

此外,在顶级的范围,selfmain,这是一个实例Object类,但方法来定义有加Object,而不是main小号单例类,这是我基于我怎么看到其他单方法的工作期待什么:

[21] pry(main)> def a.my_singleton
[21] pry(main)*   puts self
[21] pry(main)* end  
=> :my_singleton
[22] pry(main)> a.singleton_methods
=> [:my_singleton]
[23] pry(main)> A.instance_methods(false)
=> [:my_method, :sub_method]

[33] pry(main)> def why_object?
[33] pry(main)*   puts self
[33] pry(main)* end  
=> :why_object?
[34] pry(main)> why_object?
main
=> nil
[35] pry(main)> Object.instance_methods(false)
=> [:pry, :__binding__, :my_method, :sub_method, :why_object?]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么,是否有这样的规则,或者只有这几个案例需要了解?

tad*_*man 6

我认为你把"接收者"混淆为"消息接收者",这是人们通常所说的术语和"接收者",如"定义任何方法的目的地上下文".

def语法允许在方法内部调用,但在样式方面是非正统的.这样做的Ruby方法就是define_method在你可以更好地控制该方法的位置的地方.可以把它想象def成一种定义方法的简单方法,但是上下文有点滑.如果在类上下文中调用它,则定义实例方法.如果在实例方法中调用它,则定义另一个实例方法.

更好的方法是将该方法包装在以后可以使用的模块中,include或者根据需要将其包装起来extend.

在顶级范围中定义方法main,意味着您希望它们普遍可用.最好的方法是强制它们进入Object.这就是为什么在这种情况下定义方法会匆忙变得混乱的原因所以不建议用于除了琐碎程序之外的任何其他方法.


Jör*_*tag 5

Ruby 中有三个隐式上下文。

最著名的是self,当前对象和默认接收器。

第二个众所周知的是用于常量查找的范围。从广义上讲,常量查找是“词汇向外,然后继承向上”,但有很多细微差别。Ruby 维护者将此上下文称为cref

您要问的是第三个上下文,有时称为默认定义。通常,默认的定义是最近的词法封闭模块。但是,您已经发现了一个例外:在顶层,默认定义实际上是Object(另外,默认可见性private)。instance_eval更改self(到instance_eval消息的接收者)和默认定义(到接收者的单例类)。class_eval两者都更改为接收器。