2012-03-14 108 views
0

可能重复:
What does ||= mean in Ruby?'|| ='操作符在ruby中做了什么?

我是新来的Ruby和我看到这个正在这里的一个答案用:

RACK_ENV = ENV['ENVIRONMENT'] ||= 'test'

我不能找不到||=运营商的任何参考...

+0

事实上它 - 没有搜索显示:/ – bluegray 2012-03-14 09:31:30

+0

我真的很幸运 - 这是近右侧的_Related_列表的顶部,但你可能要考虑的[符号猎犬搜索引擎](http://symbolhound.com/?q=||%3D),当你需要在将来搜索符号时,我不知道他们是如何做到的,但它对谷歌的事情非常有用绝对失败在 – sarnold 2012-03-14 09:40:25

+0

哇,现在是有用的,谢谢! – bluegray 2012-03-14 10:12:18

回答

-2

||做?如果你有a和b,那么a || b为真,当且仅当a或b为真。这与|| =相同,该运算符结合了两个运算'='和'||'。所以a ||= b等于c || c = b

编辑:所以在你的上下文中ENV ['ENVIRONMENT'] || ='test'表示如果ENV ['ENVIRONMENT']不是零且不是假,它将保留它的值,否则它将成为'测试',之后ENV ['ENVIRONMENT']的新值被分配给RACK_ENV

+0

实际上它是'c || c = b'。如果c是真的,那么完全没有分配。当它实际上以大部分时间使用的方式使用时,这是一个重要的区别,即作为可选的初始化程序。 – 2012-03-14 09:38:27

+1

-1。这是错误的,正如已经在StackOverflow和Ruby邮件列表中向死亡解释过的那样。 – 2012-03-14 17:42:12

1

这里是解释它非常好的文章。

«Ruby,concurrency,... |主| |如何更新...» Ruby T-Square运算符的奇怪情况。 作者:prashant发布于2008年12月14日 “|| =”操作符很有趣,无论它如何在Ruby land中被广泛使用。运营商不会做你通常期望的。即,

一个|| = EXPR

是不一样的

A = A || EXPR

评价恰好是

一个或= EXPR

以及在至少一个用例的区别是很重要的[0]

作为一个小DTrace脚本将验证,这运算符未实现是一种方法(或Ruby地区中的任何地方)并且是VM的固有方法。原因是性能,以及当您'OR'时无需评估整个表达式以得出结果:

“Ruby的布尔运算符是内置于语言中的,并且不基于方法例如,类不能定义它们自己的方法,Ruby定义了特殊的真值和假值,但没有布尔类型的方法,原因是布尔运算符可以应用于任何值,并且必须表现为一致任何类型的操作数“。

。 。 。

“Ruby的布尔运算符是语言的核心部分而不是可重定义方法的另一个原因是二元运算符是”短路“。如果运算值完全由左操作数确定,那么右手操作数被忽略,甚至从不被评估。“

https://blogs.oracle.com/prashant/entry/the_ruby_t_square_operator