26

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

String::class
String.class

他们都做了我所期望的——也就是说他们回来了——但是使用 the和 the 有什么Class区别?::.

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

4

2 回答 2

36

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

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

于 2008-09-04T03:31:31.083 回答
12

实际上,自动完成确实适用于.. 通过调用#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自身的方法。然后我们自动完成以获取我们可以调用的方法。如果 IRB 调用,它会得到相同的东西。相反,IRB 有 1022 条建议。我不确定它们来自哪里,但它显然是一个通用列表,实际上并非基于上下文。ObjectObjectObject.bazObject.baz.methodsObject.methods

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

于 2008-09-07T02:23:09.830 回答