【问题标题】:Is there a difference between :: and . when calling class methods in Ruby?:: 和 . 之间有区别吗?在 Ruby 中调用类方法时?
【发布时间】:2010-09-07 18:33:11
【问题描述】:

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

String::class
String.class

他们都按照我的预期行事——也就是说他们返回Class——但是使用::.有什么区别?

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

【问题讨论】:

    标签: ruby syntax


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      实际上,自动完成功能确实适用于 .。通过在对象上调用 #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.methods 相同的结果。相反,IRB 有 1022 条建议。我不确定它们来自哪里,但它显然是一个通用列表,实际上并非基于上下文。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        • 2012-02-16
        • 1970-01-01
        相关资源
        最近更新 更多