3

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

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

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

有人知道有什么好处吗?

更新

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

4

5 回答 5

4

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

为什么要记住一个常数?

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

于 2013-04-17T21:49:58.823 回答
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

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

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

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

于 2013-04-17T21:43:36.590 回答
1

那个叫做 memoize 的调用 - 意味着你设置它一次,然后保留那个值,就像值的延迟加载一样。

ActiveSupport 现在有一种方法,它的工作方式与以下略有不同||=http ://apidock.com/rails/ActiveSupport/memoize

于 2013-04-17T21:47:24.197 回答
0

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

于 2015-05-01T21:26:55.780 回答
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
于 2013-04-17T21:47:33.613 回答