使用 "::" 而不是 "module ..." 进行 Ruby 命名空间
Posted
技术标签:
【中文标题】使用 "::" 而不是 "module ..." 进行 Ruby 命名空间【英文标题】:Using "::" instead of "module ..." for Ruby namespacing 【发布时间】:2011-10-19 03:29:54 【问题描述】:在 Ruby 中,为命名空间编写 class Foo::Bar
和 module 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