"||"和"||="的区别是什么?"

4

我是一名Ruby新手。

||||=有什么不同?

>> a = 6 || 4
=> 6
>> a ||= 6
=> 6

听起来它们是一样的。

不是来自Ruby,但 ||= 可能类似于 += - Grijesh Chauhan
2
"||=" 与 "+=" 非常不同。" - the Tin Man
5个回答

4

||= 将左侧的值设置为右侧的值,只有当左侧的值为假值时才会执行。

在此例中,6和4都是真值,因此a = 6 || 4将把a设置为第一个真值, 即 6

a ||= 6 只有当a为假值时(即nil或false)才把它设置为6

a = nil
a ||= 6
a ||= 4
a # => 6

1
基于上述回答,听起来像未定义也应包括在内。 - TheOneTeam
是的,你可以使用 ||= 来定义之前未定义的变量。 - Chris Heald
@KitHo 是的,我已经包含了那个.. :) - Arup Rakshit

4

x ||= y 意味着如果 xnull 或未定义 或 false,则将 y 分配给 x;它是 x = y unless x 的快捷方式。

使用 Ruby 短路运算符 ||,如果左操作数为真,则不计算右操作数。

现在来看一些关于上述内容的快速示例:||=

x 未定义且 nnil 时:

使用 unless

y = 2
x = y unless x
x # => 2

n = nil
m = 2
n = m unless n
m # => 2

使用"=||"表示等于的意思。
y = 2
x ||= y
x # => 2

n = nil
m = 2
n ||= m
m # => 2

3

a ||= 6 只有在变量 a 还没有赋值时才会将其赋值为 6。 (实际上,只要 a 的值为假,就会赋值为 6,正如 Chris 所说)

a = 4
a ||= 6
=> 4
a = 4 || 6 => 4

2
你可以将 a ||= 6 展开为:
a || a = 6

所以你可以看到,如果a不是nilfalse,它将使用a,否则它将分配值给a并返回该值。这通常用于值的记忆化。
更新:
感谢第一条评论指出了“||=”(或等于)运算符的真正扩展。我学到了新东西,并发现了这篇有趣的文章,讨论了它。http://dablog.rubypal.com/2008/3/25/a-short-circuit-edge-case

1
这是错误的。它(尽管不直观)扩展为 a || a = 6 - Ed S.
我必须承认,我从来没有考虑过那种扩展。@EdS. 你有什么来源或者我可以查证的方法吗?我已经更新了我的答案并且加入了这个信息,因为它确实有道理。 - Leo Correa
检查两个重复的主题之一。我必须承认,几年前我也和你想的一样回答了同样的问题,但是一个更有知识的SO成员纠正了我。编辑:哎呀,我看到你找到了它。 - Ed S.

1

两个表达式a = 6 || 4a ||= 6返回的结果相同,但区别在于||=只有当变量为空或false时才会将值赋给变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接