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

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 on 将涉及评估左侧,这可能会产生副作用。您也可以亲自看看:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top