什么是Ruby的双冒号`::`?

什么是这个双冒号:: ? 例如Foo::Bar

我找到了一个定义 :

::是一个一元运算符,它允许:类或模块中定义的常量,实例方法和类方法可以从类或模块外的任何地方访问。

如果你可以使用::来暴露任何东西,那么范围(private,protected)有什么用处?

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

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

您可以从模块外部访问CONSTANT作为SomeModule::InnerModule::MyClass::CONSTANT

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

相关说明:如果你想返回到顶层命名空间,请执行以下操作::: SomeModule – Benjamin Oakes

这个简单的例子说明了它:

 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 puts Foo::MR_COUNT # this is the local "Foo" constant 

采取http://www.tutorialspoint.com/ruby/ruby_operators.htm

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

当你在Rails中看到ActiveRecord::Base时,意味着Rails有类似的东西

 module ActiveRecord class Base end end 

即在ActiveRecord模块内部调用Base的类,然后将其引用为ActiveRecord::Base (您可以在activerecord -nnn / lib / active_record / base.rb的Rails源代码中找到此类)

::的一个常见用途是访问模块中定义的常量,例如

 module Math PI = 3.141 # ... end puts Math::PI 

::运算符不允许绕过标记为private或protected的方法的可见性。

如果你可以使用::来暴露任何东西,那么范围(private,protected)有什么用处?

在Ruby中,所有的东西都被暴露出来,所有东西都可以在其他地方修改。

如果你担心类可以从“类定义”之外改变,Ruby可能不适合你。

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

不,不是访问每个方法,而是一个“分辨率”运算符,也就是说,用它来解析常量/静态符号的范围(或可以说的位置)。

例如,在你的第一行中,Rails使用它来找到ActiveRecord.Module中的Base类,在第二个类中它用来定位Routes类的类方法(静态)等等。

它不是用来暴露任何东西,它用来“定位”你的范围内的东西。

http://en.wikipedia.org/wiki/Scope_resolution_operator

这是关于防止定义与其他代码链接到您的项目冲突。 这意味着你可以把事情分开。

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

Ruby on Rails使用::来命名空间解析。

 class User < ActiveRecord::Base VIDES_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 

添加到以前的答案,这是有效的Ruby使用::来访问实例方法。 以下全部有效:

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

根据最佳实践,我相信只有最后一个建议。

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

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