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

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

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

谁知道有什么好处?

UPDATE

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

===============>>#1 票数:4 已采纳

正如其他海报所提到的那样, ||=被用作记忆价值的廉价方式。 然而...

为什么要记住常数?

在多次加载源文件时,作者很可能会防止出现警告。 warning: already initialized constant VALID_VIDEO_HOSTS

===============>>#2 票数: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

如果右侧是昂贵/耗时的操作,或者通常在必须仅执行一次的初始化期间,这通常用于记忆 (缓存)。

为什么|| =分配给常量?

常量应该只初始化一次,并且当您尝试覆盖它们时至少会发出警告。 || =确保该值仅为常量赋值一次。 这样您就不会收到已经初始化常量的警告。

===============>>#3 票数:1

这称为memoize - 意味着你设置它一次,然后保持该值,就像一个懒惰的值加载。

ActiveSupport现在有一个方法与||=略有不同: http ://apidock.com/rails/ActiveSupport/memoize

===============>>#4 票数: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

===============>>#5 票数:0

我个人在项目中使用它来允许用户加载代码。 如果用户需要,用户代码可以覆盖该常量。 所以我避免错误。

  ask by Ivan Linko translate from so

未解决问题?本站智能推荐: