下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
当前回答
一个常见的误解是,||= b并不等同于a = a || b,但它的行为就像|| a = b。
但这里有一个棘手的情况。如果a未定义,则|| a = 42将引发NameError,而||= 42将返回42。所以,它们似乎不是等价的表达式。
其他回答
a ||= b
等于
a || a = b
而不是
a = a || b
因为您使用默认值定义哈希(对于任何未定义的键,哈希将返回默认值)
a = Hash.new(true) #Which is: {}
如果你使用:
a[10] ||= 10 #same as a[10] || a[10] = 10
A仍然是:
{}
但如果你这样写
a[10] = a[10] || 10
一个变成了:
{10 => true}
因为你已经在键10处赋值了它自己的值,默认为true,所以现在哈希是为键10定义的,而不是一开始就不执行赋值。
这就像延迟实例化。 如果变量已经定义,它将获取该值,而不是重新创建该值。
ruby-lang语法。正确的答案是查看ruby-lang文档。所有其他解释都令人困惑。
谷歌
"ruby-lang文档缩写赋值"。
Ruby-lang文档
https://docs.ruby-lang.org/en/2.4.0/syntax/assignment_rdoc.html#label-Abbreviated+Assignment
b = 5
a ||= b
这句话的意思是:
a = a || b
这将是
a = nil || 5
所以最后
a = 5
现在如果你再调用这个:
a ||= b
a = a || b
a = 5 || 5
a = 5
b = 6
现在如果你再调用这个:
a ||= b
a = a || b
a = 5 || 6
a = 5
如果你观察,b的值不会被分配给a, a仍然有5。
它是Ruby中用来加快访问速度的一种记忆模式。
def users
@users ||= User.all
end
这句话的意思是:
@users = @users || User.all
第一次调用这个方法时,你会调用数据库。
以后对该方法的调用将只返回@users实例变量的值。
它的意思是或等于。它检查左边的值是否有定义,然后使用它。如果不是,使用右边的值。您可以在Rails中使用它来缓存模型中的实例变量。
一个基于rails的快速示例,我们创建了一个函数来获取当前登录的用户:
class User > ActiveRecord::Base
def current_user
@current_user ||= User.find_by_id(session[:user_id])
end
end
它检查是否设置了@current_user实例变量。如果是,它将返回该值,从而节省数据库调用。但如果没有设置,则执行调用,然后将@current_user变量设置为该值。这是一种非常简单的缓存技术,但非常适合在应用程序中多次获取相同的实例变量。