下面的代码在Ruby中是什么意思?

||=

它的语法有什么意义或原因吗?


当前回答

简洁完整的回答

a ||= b

计算方法与下面每一行相同

a || a = b
a ? a : a = b
if a then a else a = b end

-

另一方面,

a = a || b

计算方法与下面每一行相同

a = a ? a : b
if a then a = a else a = b end

-

编辑:正如AJedi32在评论中指出的那样,这只在以下情况下成立:A是一个已定义变量。2. 计算一次时间和两次时间不会导致程序或系统状态的差异。

其他回答

一个常见的误解是,||= b并不等同于a = a || b,但它的行为就像|| a = b。

但这里有一个棘手的情况。如果a未定义,则|| a = 42将引发NameError,而||= 42将返回42。所以,它们似乎不是等价的表达式。

它的意思是或等于。它检查左边的值是否有定义,然后使用它。如果不是,使用右边的值。您可以在Rails中使用它来缓存模型中的实例变量。

一个基于rails的快速示例,我们创建了一个函数来获取当前登录的用户:

class User > ActiveRecord::Base

  def current_user
    @current_user ||= User.find_by_id(session[:user_id])
  end

end

它检查是否设置了@current_user实例变量。如果是,它将返回该值,从而节省数据库调用。但如果没有设置,则执行调用,然后将@current_user变量设置为该值。这是一种非常简单的缓存技术,但非常适合在应用程序中多次获取相同的实例变量。

这个问题在Ruby邮件列表和Ruby博客上讨论得如此频繁,以至于现在Ruby邮件列表上甚至有一些线程,它们的唯一目的就是收集到Ruby邮件列表上讨论这个问题的所有其他线程的链接。

这里有一个:||= (OR Equal)线程和页面的最终列表

如果你真的想知道发生了什么,可以看看Ruby语言规范草案的第11.4.2.3节“缩写赋值”。

作为第一近似,

a ||= b

等于

a || a = b

并不等同于

a = a || b

然而,这只是一种近似,特别是在a未定义的情况下。根据是简单的变量赋值、方法赋值还是索引赋值,语义也有所不同:

a    ||= b
a.c  ||= b
a[c] ||= b

都有不同的待遇。

这是默认的赋值表示法

例如:x ||= 1 这将检查x是否为nil。如果x确实为nil,那么它就会赋给它一个新值(在我们的例子中是1)

更明确的表示: 如果x == nil X = 1 结束

x ||= y

is

x || x = y

"如果x为假或未定义,则x指向y"