or
和 ||
运算符在 Ruby 中有什么区别?还是只是个人偏好?
这是一个操作符优先级的问题。
||
的优先级高于 or
。
在两者之间,你还有其他操作符,包括三目运算符 (? :
) 和赋值运算符 (=
),所以你选择哪个可能会影响语句的结果。
这里有一个Ruby 操作符优先级表。
参见这个问题,了解使用 and
/&&
的另一个例子。
此外,请注意一些可能发生的恶性事件:
a = false || true #=> true
a #=> true
a = false or true #=> true
a #=> false
前两个语句的结果都是true
,但第二个语句将a
设置为false
,因为=
优先级低于||
但高于or
。
正如其他人已经解释的那样,唯一的区别是优先级。但是,我想指出这两者实际上有两个不同之处:
and
、or
和 not
的优先级比 &&
、||
和 !
要低得多and
和 or
的优先级相同,而 &&
的优先级高于 ||
一般来说,避免使用 and
、or
和 not
,而改用 &&
、||
和 !
更具良好的编程风格。(例如Rails核心开发人员拒绝使用关键字形式而非运算符形式的修补程序。)
它们存在的原因并非是用于布尔公式,而是用于控制流程。它们通过Perl的众所周知的 do_this or do_that
惯用语进入Ruby,其中,如果存在错误,则 do_this
返回 false
或 nil
,然后才会执行 do_that
。(类似的,还有 do_this and then_do_that
惯用语。)
示例:
download_file_via_fast_connection or download_via_slow_connection
download_latest_currency_rates and store_them_in_the_cache
有时,这会使控制流比使用if
或unless
更加流畅。true && false
!= true and false
,false or true
!= false || true
。 - Yarintrue && false
实际上基本等价于 true and false
,因为没有优先级问题。同样地,(x > 1) and (x < 4)
在操作上等价于 (x > 1) && (x < 4)
,因为所有的优先级都是通过括号完成的。在这些情况下,选择仅仅是一个可读性问题。 - Marnen Laibow-Kosertrue && false
等同于 true and false
。你例子中的差异仅仅是由于隐式优先级问题造成的:print true and false
等同于 print(true) and false
,而 print true && false
等同于 print(true && false)
。你已经很好地证明了我的观点——只有在遇到没有括号的操作时,优先级才会发挥作用。 - Marnen Laibow-Koserprint(true and false)
是一个语法错误,这是我之前没有意识到的。 - Marnen Laibow-Koserand
/or
是用于控制流程的。
Ruby 不允许以下语法:
false || raise "Error"
然而这是有效的:
false or raise "Error"
你可以使用 ()
来完成第一项工作,但使用 or
是正确的方法。false || (raise "Error")
puts false or true
--> 输出:false
puts false || true
--> 输出:true
我使用这些运算符的方式:
||, &&
用于布尔逻辑。 or, and
用于控制流程。例如:
如果可能 || 可能,那么 do_smth
- 我们在此处评估条件。
do_smth or do_smth_else
- 我们定义工作流程,与 unless do_smth do_smth_else
等效。
举个简单的例子:
> puts "a" && "b"
b
> puts 'a' and 'b'
a
Rails中一个常见的习语是render and return
。它是一个快捷方式,相当于说return if render
,而render && return
则不起作用。有关更多信息,请参见Rails文档中的"避免双重渲染错误"。or
运算符的作用 :) - jayquior
与||
是不同的。请使用||
运算符而不是or
运算符。
以下是一些原因:
or
运算符的优先级低于||
。or
的优先级低于赋值运算符=
。and
和or
的优先级相同,而&&
的优先级高于||
。and
和or
在控制流中确实有它们的用处;例如,你可以写成if a==b and c==d
,并且你可以确定and
具有最低的优先级。对于来自C语言以外的人来说,这看起来也更加美观。 - DarkWiiPlayeror
和||
都在其中一个操作数为真时返回真。它们只有在第一个操作数为假时才会计算第二个操作数。
与and
一样,or
和||
唯一的区别是它们的优先级不同。
有趣的是and
和or
优先级相同,而&&
的优先级高于||
。
a = false or true
,a将被赋值为false
。 - Anwaror
被认为是一种良好的实践,因为它比||
更易读。