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

我找到了一个定义:

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

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


当前回答

下面这个简单的例子说明了这一点:

MR_COUNT = 0        # constant defined on main Object class
module Foo
  MR_COUNT = 0
  ::MR_COUNT = 1    # set global count to 1
  MR_COUNT = 2      # set local count to 2
end

puts MR_COUNT       # this is the global constant: 1
puts Foo::MR_COUNT  # this is the local constant: 2

摘自http://www.tutorialspoint.com/ruby/ruby_operators.htm

其他回答

加上前面的答案,使用::访问实例方法是有效的Ruby。以下均有效:

MyClass::new::instance_method
MyClass::new.instance_method
MyClass.new::instance_method
MyClass.new.instance_method

根据最佳实践,我认为只推荐最后一种。

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

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

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

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

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

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

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

::允许您访问在另一个类或模块中定义的常量、模块或类。它用于提供名称空间,以便不同作者的方法名和类名不会与其他类冲突。

当你在Rails中看到ActiveRecord::Base时,这意味着Rails有类似于

module ActiveRecord
  class Base
  end
end

例如,在ActiveRecord模块中一个名为Base的类,然后被引用为ActiveRecord::Base(你可以在Rails源代码ActiveRecord -n.n.n/lib/active_record/ Base .rb中找到这个)

::的常用用法是访问模块中定义的常量。

module Math
  PI = 3.141 # ...
end

puts Math::PI

操作符不允许绕过标记为private或protected的方法的可见性。

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

在Ruby中,所有内容都是公开的,并且可以从其他任何地方修改所有内容。

如果您担心可以从“类定义”之外更改类,那么Ruby可能不适合您。

另一方面,如果您对Java的类被锁定感到沮丧,那么Ruby可能是您正在寻找的对象。