首页 > 解决方案 > 命名空间模块方法定义

问题描述

我偶然在 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命名空间在这种情况下到底是做什么的,在这种情况下它的真正目的是什么。任何人都可以帮助阐明这一点吗?

标签: ruby-on-railsrubypostgresqlpg

解决方案


::是范围解析运算符。所以从自我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())。不要将 :: 用于常规方法调用。


推荐阅读