在Ruby中,|| =(or-equals)是什么意思?

如下代码在Ruby中的含义是什么? html

||=

它的语法是否有任何意义或缘由? ruby


#1楼

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设置ab 。 若是ab都是局部变量,那么这种区别并不重要,但若是它们是类的getter / setter方法则很重要。 spa

进一步阅读: code


#2楼

x ||= y

htm

x || x = y

“若是x为false或未定义,则x指向y” ip


#3楼

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定义了哈希,而不是从不首先执行赋值。


#4楼

假设a = 2b = 3

那么, a ||= b将致使a的值,即2

做为当计算结果为某个值没有致使以falsenil ..这就是为何它ll不计算b的值。

如今假设a = nilb = 3

那么a ||= b将获得3b的值。

由于它首先尝试评估一个致使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])


#5楼

简洁而完整的答案

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.评估一次和两次不会致使程序或系统状态的差别。

相关文章
相关标签/搜索