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

简单的问题,但我一直很好奇的是……以下两个命令之间是否存在function差异?

String::class String.class 

他们都做我期望的 – 也就是说他们返回Class – 但使用::和之间的区别是什么.

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

这个. 运算符基本上说“将此消息发送给对象”。 在您的示例中,它调用该特定成员。 ::运算符“向下钻取”到运算符左侧定义的范围,然后调用运算符右侧定义的成员。

使用::时必须引用已定义的成员。 使用时. 您只是向对象发送消息。 因为该消息可以是任何内容,所以自动完成不起作用. 虽然它适用于::

实际上,自动完成确实有效. 。 通过在对象上调用#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) 

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

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