【发布时间】:2014-11-07 20:47:26
【问题描述】:
:: 是什么?
@song ||= ::TwelveDaysSong.new
【问题讨论】:
-
我知道命名空间,但我没有看到 :: 在没有前缀的情况下使用。我想这让我感到困惑。我现在明白它指的是根级对象命名空间
标签: ruby
:: 是什么?
@song ||= ::TwelveDaysSong.new
【问题讨论】:
标签: ruby
Ruby ::(双分号)
顶级常量由双冒号引用
class TwelveDaysSong
end
a = TwelveDaysSong.new
#I could wrote it like this too
a = ::TwelveDaysSong.new
module Twelve
class TwelveDaysSongs
end
end
b = Twelve::TwelveDaysSong.new
#b is not equal to
a = ::TwelveDaysSong.new
#neither
a = TwelveDaysSong.new
类也是常量,所以如果你有一个常量
HELLOWOLRD = 'hw'
你可以这样称呼它::HELLOWORLD
【讨论】:
这是一种延迟初始化@song 实例变量的方法。
如果@song 已设置(设置为某个真实值,即不是nil 或false),则表达式仅计算为该值。
但是,如果 @song 尚未设置为这样的值,则它会创建类 TwelveDaysSong 的新实例并将其分配给 @song。然后,和以前一样,表达式的计算结果为 @song 的值,但该值现在是对新创建的 TwelveDaysSong 对象的引用。
在类名上使用::表示它是一个绝对的、顶级的类;即使在当前模块中定义了TwelveDaysSong 类,它也会使用顶级类。
【讨论】:
返回@song
如果@song 为假(例如它不存在)
将::TwelveDaysSong 对象的新实例创建为@song
【讨论】: