::和之间有区别吗?在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
是。