首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby布尔运算符: word运算符与符号运算符

Ruby布尔运算符: word运算符与符号运算符
EN

Stack Overflow用户
提问于 2015-01-24 02:58:13
回答 1查看 138关注 0票数 0

在Ruby中,单词布尔运算符(andornot)可以与符号布尔运算符(&&||!)互换吗?我可以根据个人喜好在代码中使用这两组运算符中的任何一组吗?

EN

回答 1

Stack Overflow用户

发布于 2015-01-24 02:58:13

Ruby布尔运算符优先级

在Ruby中,C风格的布尔运算符(!&&||)不能与"English word“布尔运算符(notandor)互换,因为它们相对于其他Ruby运算符具有不同的优先级。后者旨在用于程序流控制。示例:

代码语言:javascript
复制
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

相对于三元条件运算符

代码语言:javascript
复制
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

相对于分配

代码语言:javascript
复制
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 '('

相对于比较运算符

代码语言:javascript
复制
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?

代码语言:javascript
复制
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 '('

相对于其他布尔运算符

单词运算符andor具有相同的优先级,因此从左到右进行计算。相比之下,&&||具有更高的优先级。

代码语言:javascript
复制
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. 1 or 2。它的计算结果为值1.
  2. Then

is

  1. 1 and 3 is thus,因此将流控制传递到thus的右侧,因此该行的最终值为thus

这行代码被认为是两个不同的表达式。

相反,上面的第三种情况(1 || 2 && 3)被认为是一个单独的表达式,在1 ||处短路,立即返回值1

代码语言:javascript
复制
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
=> 1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28116852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档