使用 "::" 而不是 "module ..." 进行 Ruby 命名空间

Posted

技术标签:

【中文标题】使用 "::" 而不是 "module ..." 进行 Ruby 命名空间【英文标题】:Using "::" instead of "module ..." for Ruby namespacing 【发布时间】:2011-10-19 03:29:54 【问题描述】:

在 Ruby 中,为命名空间编写 class Foo::Barmodule Foo; class Bar 有区别吗?如果有,是什么?

【问题讨论】:

【参考方案1】:

如果您使用class Foo::Bar,但尚未定义Foo 模块,则会引发异常,而module Foo; class Bar 方法将定义Foo(如果尚未定义)。

此外,使用块格式,您可以在以下范围内定义多个类:

module Foo
  class Bar; end
  class Baz; end
end

【讨论】:

另外,如果Foo 被定义为一个类,Foo::Bar 不会引发异常,而module Foo; end 将引发TypeError,因为Foo 不是一个模块而是一个类。 【参考方案2】:

还要注意这个奇怪的 Ruby 主义:

FOO = 123

module Foo
  FOO = 555
end

module Foo
  class Bar
    def baz
      puts FOO
    end
  end
end

class Foo::Bar
  def glorf
    puts FOO
  end
end

puts Foo::Bar.new.baz    # -> 555
puts Foo::Bar.new.glorf  # -> 123

【讨论】:

您能否解释一下为什么会在您的示例中发生这种情况?我认为第二次调用也会返回 555。 @WillsonMock 好问题。我几乎会为此提出一个新的 SO 问题。我在写这篇文章时找到了答案,但现在我不记得了,再也找不到了。也应该在这里的答案中发布它:-/顺便说一句,也发生在课程中。不仅仅是模块。 酷,如果您想关注,这是我发布的新 SO 问题:***.com/questions/15119724/…

以上是关于使用 "::" 而不是 "module ..." 进行 Ruby 命名空间的主要内容,如果未能解决你的问题,请参考以下文章

python如何字符串转化为函数计算得小数?eval()只能转化为整数。就像"2/9-3"结果是-2.77777而不是-3

response.addHeader("Content-disposition","attachment;filename=" + filename + &qu

OAuthException using Socialite with facebook - "message": "必须使用活动访问令牌来查询有关当前用户的信息。&qu

文件流:"fopen","fclose",“ftell”"fseek","fgets","fprintf&qu

"errors":"errors":["detail":"您无权执行此操作。","code":&qu

调用 Coinbase pro 沙盒 api 时,无效:401 Unauthorized。文本:""message":"invalid signature&qu