Ruby and 和 && 是不同的

huacnlee · 2012年06月20日 · 最后由 steven_lv 回复于 2018年03月27日 · 9774 次阅读
本帖已被管理员设置为精华贴

http://www.themomorohoax.com/2008/12/08/and-vs-amperand-in-ruby

>> alien = true
>> speaks_english = false

# 1
>> alien and speaks_english ? 'hello' : '**silence**'
=> "**silence**"

# 2
>> alien && speaks_english ? 'hello' : '**silence**'
=> "**silence**"

# 3
>> speaks_english and alien ? 'hello' : '**silence**'
=> false  # oops

# 4
>> speaks_english && alien ? 'hello' : '**silence**'
=> "**silence**"
>> hammer_of_truth = true
>> anvil_of_false = false

>> sword = hammer_of_truth && anvil_of_false
=> false
>> sword
=> false

>> sword = hammer_of_truth and  anvil_of_false
=> false
>> sword
=> true # oops

用到多个运算符的除了+-*/,不加括号的都去死。

要是我设计语言,运算符优先级一定是能不定义就不定义的。

优先级问题大部分入门书上都有讲的...不过我前几天就犯过一个这样的错误.......

是 and 的优先级比较低的缘故么?

看书的时候看到过 && 比 and 优先级高,经过这个实例,巩固了我的知识,谢谢@huacnlee ,我的 9527 ;-D

我也是才知道....

#4 楼 @chucai 是的,把它理解成串联表达式的助词就够了

#6 楼 @huacnlee 我隐约记得 Github 的 ruby best practice 里面写着 always use && & ||, 看过之后我就不写 and 跟 or 了。

我是一直写 and 的,觉得这样更好看...

用于判断都用 && || ,and or 可以用于流程。

但是流程我一般不会写在一行,所以 and or 很少用鰳

匿名 #11 2012年06月20日

Ruby language 上讲过。。一般正常人类还是加括号好点

看到后来,就想到了优先级。受教

我 and 只是偶尔用在流程控制上,比如

sleep 5 and p 'sleep 5 seconds' and break 看着也不差,写多行感觉太多了

我会习惯性加()的~~

and/or看起来不象||、&&、=这样的符号,所以优先级不同,不过具体使用时我们容易陷入程序员的思维定势,所以我基本不用 and/or

#9 楼 @huacnlee 我也一直用 and,觉得这样可读性好

匿名 #18 2012年06月20日

ruby 操作符优先级最低的三个是 not, and, or, 相应的 !, &&, || 的优先级比它们高很多。这就是它们最大的区别。我觉得反而 not 最特别:它身为一元操作符,优先级却极其低

想起了之前一篇文章专门讲a ||= ba = a || b的区别,看了之后虽然懂了,但感觉很蛋疼。希望这种需要拗脚尖的问题越小越好,对已对别人阅读代码都无益。

看来我先学 ruby 有好处,这个我知道哦,呵呵

晕,我看着第一行就不对,@huacnlee 你做过测试吗?

alien and speaks_english ? 'hello' : '**silence**'

很明显,这个等价于:alien and (speaks_english ? 'hello' : 'silence'), 结果应该为 true.

#16 楼 @fsword

我觉得你这样讲是不对的。也许你之前用了太久其他语言,但是在 Ruby 中,and or not 优先级极低 (只比 if 高一点点), 这样设定的原因是:在不加括号的前提下,不会影响到其他逻辑的正确性,换句话说,大多数情况下,你尽管去写代码好了,甚至不用考虑是否加括号。?: 算是一个例外,好的风格建议是:(...) ? (...) : (...) .

#21 楼 @zw963 之前的表述有误,这是我个人为了便于记忆而做的解释,实际为什么这么设计我也不清楚

#21 楼 @zw963 难道你的 ruby 编译器是自己写的?结果应该为 true?你自己没测试吧? 当 alien 为 true 的时候,才执行后面 speaks_english ? 'hello' : 'silence'的代码,那你觉得会返回什么呢?

#23 楼 @googya


alien = true
speaks_english = false

p  alien and speaks_english ? 'hello' : '**silence**'

你觉得这个代码,执行结果是什么?你自己运行下

#24 楼 @zw963 嘿,哥们,你瞧好了:

#24 楼 @zw963 是咱们的 ruby 版本不一样。我的是 1.9.3,你的应该是 1.8.7。 真是个坑

应该是 p 方法的问题吧....

o(∩∩)o...哈哈 p (alien and speaks_english ? 'hello' : 'silence') 就一样了

#27 楼 @alice #28 楼 @hooopo 哎,不应争的,激动了。

不过,确实 1.9.3 和 ree 之间还是存在区别的:

1.9.3

ree(1.8.7)

#29 楼 @googya

是我搞错了。

首先,我想当然的认为:true and "a string" , 那结果肯定是 true, 然后又没有加括号...

这次正好纠正了我一个严重的错误...

个人感觉:&& || 主要用于判断,and or 主要用于流程

前两天刚吃过亏。。。😂

需要 登录 后方可回复, 如果你还没有账号请 注册新账号