在模型中使用|| =而不是=来定义常量的原因是什么

时间:2013-04-17 21:42:21

标签: ruby-on-rails ruby

在当前项目中找到了这个:

class Video < ActiveRecord::Base
  ...
  VALID_VIDEO_HOSTS ||= %w(www.youtube.com youtube.com vimeo.com www.vimeo.com)
  ...
end

通常我使用简单的VALID_VIDEO_HOSTS =%w(...)并且没有任何猜测为什么以前的开发人员使用了|| =

有人知道有什么好处吗?

更新

我知道什么是|| =在一般情况下,问题主要是关于在模型中定义常量。

4 个答案:

答案 0 :(得分:4)

正如其他海报所提到的那样,{p> ||=被用作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