在Ruby中,单词布尔运算符(and,or,not)可以与符号布尔运算符(&&,||,!)互换吗?我可以根据个人喜好在代码中使用这两组运算符中的任何一组吗?
发布于 2015-01-24 02:58:13
Ruby布尔运算符优先级
在Ruby中,C风格的布尔运算符(!,&&,||)不能与"English word“布尔运算符(not,and,or)互换,因为它们相对于其他Ruby运算符具有不同的优先级。后者旨在用于程序流控制。示例:
do_something_which_returns_true_on_success and
do_something_else_only_when_the_first_thing_succeeds
do_something_which_returns_false_on_failure or
do_something_else_if_the_first_thing_failed相对于三元条件运算符
1.9.3-p374 :023 > false and true ? "a" : "b"
=> false
1.9.3-p374 :024 > false && true ? "a" : "b"
=> "b"
1.9.3-p374 :097 > ! true ? 'a' : 'b'
=> "b"
1.9.3-p374 :098 > not true ? 'a' : 'b'
=> false相对于分配
1.9.3-p374 :061 > x = 'a' and 'b'; x
=> "a"
1.9.3-p374 :062 > y = 'a' && 'b'; y
=> "b"
1.9.3-p374 :110 > z = ! true; z
=> false
1.9.3-p374 :111 > z = not true; z
SyntaxError: (irb):111: syntax error, unexpected keyword_true, expecting '('相对于比较运算符
1.9.3-p374 :092 > def troo; true; end
1.9.3-p374 :093 > def falce; false; end
1.9.3-p374 :094 > troo == ! falce
=> true
1.9.3-p374 :095 > troo == not falce
SyntaxError: (irb):95: syntax error, unexpected tIDENTIFIER, expecting '('相对于defined?
1.9.3-p374 :076 > undefined_variable
NameError: undefined local variable or method `undefined_variable' for main:Object
1.9.3-p374 :077 > defined? undefined_variable || 'a'
=> "expression"
1.9.3-p374 :078 > defined? undefined_variable or 'a'
=> "a"
1.9.3-p374 :079 > defined? undefined_variable && 'a'
=> "expression"
1.9.3-p374 :080 > defined? undefined_variable and 'a'
=> nil
1.9.3-p374 :083 > defined? 'a' && undefined_variable
=> "expression"
1.9.3-p374 :084 > defined? 'a' and undefined_variable
NameError: undefined local variable or method `undefined_variable' for main:Object
1.9.3-p374 :113 > defined? ! undefined_variable
=> nil
1.9.3-p374 :114 > defined? not undefined_variable
SyntaxError: (irb):114: syntax error, unexpected tIDENTIFIER, expecting '('相对于其他布尔运算符
单词运算符and和or具有相同的优先级,因此从左到右进行计算。相比之下,&&比||具有更高的优先级。
1.9.3-p374 :150 > true || true && false
=> true
1.9.3-p374 :151 > true or true and false
=> false
1.9.3-p374 :153 > 1 || 2 && 3
=> 1
1.9.3-p374 :152 > 1 or 2 and 3
=> 3上面的第四种情况(1 or 2 and 3)可以这样解释:
首先计算
1 or 2。它的计算结果为值1.is
1 and 3 is thus,因此将流控制传递到thus的右侧,因此该行的最终值为thus这行代码被认为是两个不同的表达式。
相反,上面的第三种情况(1 || 2 && 3)被认为是一个单独的表达式,在1 ||处短路,立即返回值1。
1.9.3-p374 :163 > def meth1; puts "meth1 executed"; 1; end
1.9.3-p374 :164 > def meth2; puts "meth2 executed"; 2; end
1.9.3-p374 :165 > def meth3; puts "meth3 executed"; 3; end
1.9.3-p374 :166 > meth1 or meth2 and meth3
meth1 executed
meth3 executed
=> 3
1.9.3-p374 :167 > meth1 || meth2 && meth3
meth1 executed
=> 1https://stackoverflow.com/questions/28116852
复制相似问题