::和之间有区别吗?在Ruby中调用类方法时?

问题描述:

简单的问题,但我一直很好奇......是否有以下两个命令之间的功能差异?::和之间有区别吗?在Ruby中调用类方法时?

String::class 
String.class 

他们都做什么,我期待的 - 也就是说,他们返回Class - 但就是使用::.之间的区别?

我注意到,在那些定义了常量的类上,当你在::之后按Tab键时,IRB的自动完成将返回常量作为可用选项,但我不知道这是什么原因。 ..

.运营商基本上说“发送此消息到对象”。在你的例子中,它正在调用该特定成员。 ::运算符“向下钻取”到在运算符左侧定义的范围,然后调用运算符右侧定义的成员。当您使用::时,您必须引用已定义的成员。使用.时,您只需向对象发送消息。由于该消息可能是任何内容,因此自动完成对.不起作用,而对于::则自动完成不起作用。

实际上,自动完成对.有效。完成选项可通过在对象上调用#methods找到。您可以通过覆盖Object.methods看到自己:

>> def Object.methods; ["foo", "bar"]; end 
=> nil 
>> Object.[TAB] 
Object.foo Object.bar 
>> Object. 

注意,当表达了.的左边是一个文字这仅适用。否则,让对象调用#methods将涉及评估左侧,这可能会有副作用。您可以也看到自己这一点:

[continuing from above...] 
>> def Object.baz; Object; end 
=> nil 
>> Object.baz.[TAB] 
Display all 1022 possibilities? (y or n) 

我们添加一个方法来#baz其中Object返回Object本身。然后我们自动完成以获取我们可以拨打的方法Object.baz。如果IRB调用Object.baz.methods,它会得到与Object.methods相同的结果。相反,IRB有1022条建议。我不确定它们来自哪里,但它显然是一个通用的列表,实际上并不基于上下文。

::运算符(也)用于获取模块的常量,而.不是。这就是为什么HTTP将出现在Net::的完成中,而不是Net.Net.HTTP是不正确的,但Net::HTTP是。