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

::和之间有区别吗。在Ruby中调用类方法时?,ruby,syntax,Ruby,Syntax,这个问题很简单,但我一直很好奇……以下两个命令之间有功能上的区别吗 String::class String.class 它们都做了我期望的事情——也就是说它们返回类——但是使用:和有什么区别呢 我注意到,在那些定义了常量的类上,当您在::之后按tab键而不是在之后按tab键时,IRB的自动完成将返回常量作为可用选项,但我不知道这是什么原因…操作符基本上说“将此消息发送到对象”。在您的示例中,它正在调用该特定成员。:操作符“深入”到操作符左侧定义的范围,然后调用操作符右侧定义的成员 使用:时,

这个问题很简单,但我一直很好奇……以下两个命令之间有功能上的区别吗

String::class
String.class
它们都做了我期望的事情——也就是说它们返回
——但是使用
有什么区别呢


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

操作符基本上说“将此消息发送到对象”。在您的示例中,它正在调用该特定成员。
操作符“深入”到操作符左侧定义的范围,然后调用操作符右侧定义的成员


使用
时,必须引用已定义的成员。使用
时,您只需向对象发送一条消息。因为该消息可以是任何内容,所以自动完成不适用于
,而适用于

实际上,自动完成适用于
。通过调用对象上的
#方法
可以找到完成选项。通过重写
对象,您可以自己看到这一点。方法

>> 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.baz
的方法。如果IRB调用
Object.baz.methods
,它将得到与
Object.methods
相同的结果。相反,IRB有1022条建议。我不确定它们来自哪里,但很明显,这是一个通用列表,实际上并不基于上下文

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