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

我找到了一个定义:

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

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


当前回答

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

当你在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 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

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

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

不,它不是访问每个方法,它是一个“解析”操作符,也就是说,你用它来解析一个常量/静态符号的范围(或者你可以说的位置)。

例如,在第一行中,Rails使用它来查找ActiveRecord内部的基类。模块,在你的第二个模块中,它用于定位路由类的类方法(静态),等等。

它不是用来暴露任何东西,而是用来“定位”你瞄准镜周围的东西。

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

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

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

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

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

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

思考

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