这个双冒号::是什么?例如Foo:酒吧。

我找到了一个定义:

::是一个一元操作符,允许在类或模块内定义的:常量、实例方法和类方法从类或模块外的任何地方访问。

如果你只能使用::来暴露任何东西,那么作用域(私有的,受保护的)有什么用呢?


当前回答

::基本上是一个名称空间解析运算符。它允许您访问模块中的项,或类中的类级项。例如,假设你有这样的设置:

module SomeModule
    module InnerModule
        class MyClass
            CONSTANT = 4
        end
    end
end

你可以通过SomeModule::InnerModule::MyClass::CONSTANT从模块外部访问CONSTANT。

它不会影响类中定义的实例方法,因为您可以使用不同的语法(点。)访问这些实例方法。

相关提示:如果你想回到顶层的命名空间,请执行:::SomeModule - Benjamin Oakes

其他回答

Ruby on rails使用::进行名称空间解析。

class User < ActiveRecord::Base

  VIDEOS_COUNT = 10
  Languages = { "English" => "en", "Spanish" => "es", "Mandarin Chinese" => "cn"}

end

使用它:

User::VIDEOS_COUNT
User::Languages
User::Languages.values_at("Spanish") => "en"

另外,其他用法是:当使用嵌套路由时

OmniauthCallbacksController在用户下定义。

并路由为:

devise_for :users, controllers: {omniauth_callbacks: "users/omniauth_callbacks"}


class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

end

这一切都是为了防止定义与链接到项目中的其他代码冲突。这意味着你可以把事情分开。

例如,你可以在你的代码中有一个名为“run”的方法,你仍然可以调用你的方法,而不是在你链接的其他库中定义的“run”方法。

::基本上是一个名称空间解析运算符。它允许您访问模块中的项,或类中的类级项。例如,假设你有这样的设置:

module SomeModule
    module InnerModule
        class MyClass
            CONSTANT = 4
        end
    end
end

你可以通过SomeModule::InnerModule::MyClass::CONSTANT从模块外部访问CONSTANT。

它不会影响类中定义的实例方法,因为您可以使用不同的语法(点。)访问这些实例方法。

相关提示:如果你想回到顶层的命名空间,请执行:::SomeModule - Benjamin Oakes

稍微恢复一下这个线程。 我们可以为这个操作符创建一个ruby名称吗:: 令人惊讶的是,我们还没有,因为我们有飞溅,蔓延,散列火箭等。

当然我们可以想出比“双冒号”或“一元运算符”更有趣的东西

思考

四点 四眼 利乐点 啃(半字节- 4位)

Surprisingly, all 10 answers here say the same thing. The '::' is a namespace resolution operator, and yes it is true. But there is one gotcha that you have to realize about the namespace resolution operator when it comes to the constant lookup algorithm. As Matz delineates in his book, 'The Ruby Programming Language', constant lookup has multiple steps. First, it searches a constant in the lexical scope where the constant is referenced. If it does not find the constant within the lexical scope, it then searches the inheritance hierarchy. Because of this constant lookup algorithm, below we get the expected results:

module A
  module B
      PI = 3.14
      module C
        class E
          PI = 3.15
        end
        class F < E
          def get_pi
            puts PI
          end
        end
      end
  end
end
f = A::B::C::F.new
f.get_pi
> 3.14

F继承自E,而B模块在F的词法范围内。因此,F实例将引用模块B中定义的常数PI。现在,如果模块B没有定义PI,那么F实例将引用超类E中定义的PI常量。

但是如果我们使用'::'而不是嵌套模块呢?我们会得到同样的结果吗?不!

通过在定义嵌套模块时使用名称空间解析操作符,嵌套模块和类不再在其外部模块的词法范围内。如下所示,在A::B中定义的PI不在A::B::C::D的词法范围内,因此当我们试图在get_pi实例方法中引用PI时,会得到未初始化的常量:

module A
end

module A::B
  PI = 3.14
end

module A::B::C
  class D
    def get_pi
      puts PI
    end
  end
end
d = A::B::C::D.new
d.get_pi
NameError: uninitialized constant A::B::C::D::PI
Did you mean?  A::B::PI