Ruby和Ruby之间的差异?
Ruby中&&
and
运算符有什么区别?
and
&&
相同,但优先级较低 。 他们都使用短路评估 。
警告:甚至比=
更低的优先级,所以你要避免and
总是
实际的区别是约束力,如果你没有做好准备,这可能会导致特殊的行为:
foo = :foo bar = nil a = foo and bar # => nil a # => :foo a = foo && bar # => nil a # => nil a = (foo and bar) # => nil a # => nil (a = foo) && bar # => nil a # => :foo
同样的事情适用于||
和or
。
Ruby风格指南比我能说的更好:
使用&& / || 用于布尔表达式,和/或用于控制流。 (经验法则:如果您必须使用外部圆括号,则使用错误的操作符。)
# boolean expression if some_condition && some_other_condition do_something end # control flow document.saved? or document.save!
||
和&&
绑定在编程语言中布尔运算符期望的优先级( &&
非常强, ||
稍弱)。
and
和or
具有较低的优先级。
例如,不像||
, or
具有比=
更低的优先级:
> a = false || true => true > a => true > a = false or true => true > a => false
同样,与&&
不同,它的优先级也低于=
:
> a = true && false => false > a => false > a = true and false => false > a => true
更重要的是,不像&&
和||
, and
和or
绑定相同的优先级:
> !puts(1) || !puts(2) && !puts(3) 1 => true > !puts(1) or !puts(2) and !puts(3) 1 3 => true > !puts(1) or (!puts(2) and !puts(3)) 1 => true
弱绑定and
和or
可能是有用的控制流的目的:请参阅http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ 。
优先级低于&&
。
但是对于一个不起眼的用户,如果与优先级在其间的其他运算符(例如赋值运算符)一起使用,则可能会出现问题。
例如
def happy?() true; end def know_it?() true; end todo = happy? && know_it? ? "Clap your hands" : "Do Nothing" todo # => "Clap your hands" todo = happy? and know_it? ? "Clap your hands" : "Do Nothing" todo # => true
并且具有较低的优先级,我们大多使用它作为控制流修饰符如if
next if widget = widgets.pop
变
widget = widgets.pop and next
为或
raise "Not ready!" unless ready_to_rock?
变
ready_to_rock? or raise "Not ready!"
我更喜欢使用,但不是,因为如果是更易理解,所以我只是忽略和和或 。
参考
在Ruby中使用“和”和“或”