我正在查看以下代码:
module Tag
def sync_taggings_counter
::Tag.find_each do |t|
# block here
end
end
end
我::Tag
对 Tag 模块内部感到困惑。
我知道双冒号用于在类/模块中命名空间类和模块。但我从未见过像上面那样使用它。究竟是什么意思?
这是一个范围修饰符。用双冒号前缀常量 ( Tag
) 可确保您查看的是根/全局命名空间,而不是当前模块。
例如
module Foo
class Bar
def self.greet
"Hello from the Foo::Bar class"
end
end
class Baz
def self.scope_test
Bar.greet # Resolves to the Bar class within the Foo module.
::Bar.greet # Resolves to the global Bar class.
end
end
end
class Bar
def self.greet
"Hello from the Bar class"
end
end
如果在本地模块中找不到引用的常量,Ruby 会自动在全局命名空间中查找,因此前置通常是不必要的。因此,如果Bar
Foo 模块中不存在,那么Bar.greet
并且::Bar.greet
会做同样的事情。