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

我找到了一个定义:

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

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


当前回答

module Amimal
      module Herbivorous
            EATER="plants" 
      end
end

Amimal::Herbivorous::EATER => "plants"

::用于创建作用域。为了从2个模块中访问Constant EATER,我们需要确定模块的范围以达到常数

其他回答

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

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

module Amimal
      module Herbivorous
            EATER="plants" 
      end
end

Amimal::Herbivorous::EATER => "plants"

::用于创建作用域。为了从2个模块中访问Constant EATER,我们需要确定模块的范围以达到常数

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

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

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

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

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

简单来说,它是一个命名空间, 命名空间是模块、类、函数等的容器。同时也有助于解决名称冲突的问题。 在ruby中,你可以通过模块访问命名空间

module A
  class Article
     def Base
     end
  module B
  end
end

所以要访问类Article,我们使用A::Article。 在某些情况下你会看到 答::文章<应用程序::Base 这意味着模块A的Article类继承了Application模块的基类。

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

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

思考

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