如下代码在Ruby中的含义是什么? html
||=
它的语法是否有任何意义或缘由? ruby
a ||= b
是条件赋值运算符 。 这意味着若是a
未定义或falsey ,而后评估b
,并设置a
对的结果 。 一样地,若是a
被定义而且评估为真实,则不评估b
,而且不进行任何分配。 例如: session
a ||= nil # => nil a ||= 0 # => 0 a ||= 2 # => 0 foo = false # => false foo ||= true # => true foo ||= false # => true
使人困惑的是,它看起来与其余赋值运算符(例如+=
)相似,但表现不一样。 ide
a += b
转换为a = a + b
a ||= b
粗略转换为a || a = b
a || a = b
它是a || a = b
的近似简写 a || a = b
。 不一样之处在于,当a
未定义时, a || a = b
a || a = b
会提升NameError
,而a ||= b
设置a
到b
。 若是a
和b
都是局部变量,那么这种区别并不重要,但若是它们是类的getter / setter方法则很重要。 spa
进一步阅读: code
x ||= y
是 htm
x || x = y
“若是x为false或未定义,则x指向y” ip
a ||= b
至关于 get
a || a = b
并非 pip
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
定义了哈希,而不是从不首先执行赋值。
假设a = 2
且b = 3
那么, a ||= b
将致使a
的值,即2
。
做为当计算结果为某个值没有致使以false
或nil
..这就是为何它ll
不计算b
的值。
如今假设a = nil
且b = 3
。
那么a ||= b
将获得3
即b
的值。
由于它首先尝试评估一个致使nil
的值...因此它评估了b
的值。
ror应用程序中使用的最佳示例是:
#To get currently logged in iser def current_user @current_user ||= User.find_by_id(session[:user_id]) end # Make current_user available in templates as a helper helper_method :current_user
其中,当且仅当@current_user
未在以前初始化时,才会触发User.find_by_id(session[:user_id])
。
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在评论中指出的那样,这只适用于:1。a是一个已定义的变量。 2.评估一次和两次不会致使程序或系统状态的差别。