ruby-on-rails - 命名空间模块方法定义
问题描述
我偶然在 Ruby 的Postgresql gem中看到了这段代码:
### Convenience alias for PG::Connection.new.
def self::connect( *args )
return PG::Connection.new( *args )
end
我玩了一会儿,结果发现这个东西就像一个普通的模块类方法一样使用(它被称为:)PG.connect
。事实上,我们可以说def self.connect ( #args ) ... end
,它的工作原理是一样的。
因为self::whatever
这对我来说是第一次,所以我想知道self
命名空间在这种情况下到底是做什么的,在这种情况下它的真正目的是什么。任何人都可以帮助阐明这一点吗?
解决方案
::
是范围解析运算符。所以从自我self::connect
解决。connect
这意味着它相当于self.connect
. 你可以从这个非常人为的例子中看到它是如何工作的:
class Foo; end
class Bar
def Foo::baz
"Hello World"
end
end
puts Foo.baz # "Hello World"
当然,我们也可以只使用def Foo.baz
来获得完全相同的结果。
Ruby 风格指南不鼓励使用双冒号来定义方法:
不要使用 :: 来定义类方法。
# bad class Foo def self::some_method end end # good class Foo def self.some_method end end
除了引用常量和构造函数之外,也不推荐使用它:
仅使用 :: 来引用常量(包括类和模块)和构造函数(如 Array() 或 Nokogiri::HTML())。不要将 :: 用于常规方法调用。