在当前项目中找到了这个:
class Video < ActiveRecord::Base
...
VALID_VIDEO_HOSTS ||= %w(www.youtube.com youtube.com vimeo.com www.vimeo.com)
...
end
通常我使用简单的VALID_VIDEO_HOSTS =%w(...)并且没有任何猜测为什么以前的开发人员使用了|| =
有人知道有什么好处吗?
更新
我知道什么是|| =在一般情况下,问题主要是关于在模型中定义常量。
答案 0 :(得分:4)
||=
被用作memoize the value的廉价方式。然而...
为什么要记住常量?
在多次加载源文件时,作者最有可能防止出现警告。 (warning: already initialized constant VALID_VIDEO_HOSTS
)
答案 1 :(得分:2)
||=
会记住值 - 它只设置一次值 - 只有先前没有定义过。随后调用时,该值已设置且不会被修改。它使用Ruby的延迟加载来评估左侧是否为布尔值,并且仅当它为nil或false时才进行赋值。
这两行是等价的:
var ||= something
var = something if var.nil? # this is equivalent to ||=
# Note: memoizing with ||= only works if the right-hand side is not a boolean function;
# because if it's value would be false, it could not use Ruby's lazy-loading
如果右侧是昂贵/耗时的操作,或者通常只在初始化期间必须执行一次,这通常用于 memoizing (缓存)。
为什么|| =分配给常量?
常量只应初始化一次,并且在尝试覆盖它们时至少会发出警告。 || =确保仅为常量赋值一次。这样您就不会收到已经初始化常量的警告。
答案 2 :(得分:1)
调用memoize - 意味着你设置一次,然后保留该值,就像延迟加载值一样。
ActiveSupport现在有一种方法,其工作方式与||=
略有不同:
http://apidock.com/rails/ActiveSupport/memoize
答案 3 :(得分:0)
它用于懒惰初始化值。在你的例子中没有太多的要求它,因为创建字符串数组的开销不是那么多。一个更好的例子是:
class WebsiteImageHelper
def get_image_files
#recurse directories looking for images
#this will only happen once per instance of
#WebsiteImageHelper
@image_files ||= Dir['images/**/**']
end
end