Ruby 区别于;及;及&;用红宝石?
Ruby中的Ruby 区别于;及;及&;用红宝石?,ruby,operators,Ruby,Operators,Ruby中的&和和运算符之间有什么区别?和与&相同,但有不同之处。他们都使用 警告:和的优先级甚至低于=,因此您通常希望避免使用和。应使用和的示例可在“.”下的导轨中找到。实际区别在于结合强度,如果您没有准备好,可能会导致特殊行为: foo = :foo bar = nil a = foo and bar # => nil a # => :foo a = foo && bar # => nil a # => nil a = (foo and bar)
&
和和运算符之间有什么区别?和与&
相同,但有不同之处。他们都使用
警告:和
的优先级甚至低于=
,因此您通常希望避免使用和
。应使用和
的示例可在“.”下的导轨中找到。实际区别在于结合强度,如果您没有准备好,可能会导致特殊行为:
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
同样的事情也适用于|
和或他们比我说得更好:
对布尔表达式和/或控制流使用&&/| |。(议事规则)
拇指:如果你必须使用外圆括号,你用错了
操作员。)
|
和&
以编程语言中布尔运算符所期望的优先级绑定(&&
非常强,|
稍弱)
和
和或
的优先级较低
例如,与|
不同,或
的优先级低于=
:
> 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
同样,与&&
不同,和的优先级也低于=
:
> 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
此外,与&&
和|
不同,和和或以同等优先级绑定:
> !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
弱绑定的和
和或
可用于控制流目的:请参阅。和
的优先级低于&
但对于一个谦逊的用户,如果它与优先级介于两者之间的其他运算符(例如赋值运算符)一起使用,则可能会出现问题:
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
和
的优先级较低,我们通常将其用作控制流修饰符,如如果
:
next if widget = widgets.pop
变成
widget = widgets.pop and next
ready_to_rock? or raise "Not ready!"
对于或:
raise "Not ready!" unless ready_to_rock?
变成
widget = widgets.pop and next
ready_to_rock? or raise "Not ready!"
我更喜欢使用if
而不是和,因为if
更容易理解,所以我只忽略和和或
有关更多信息,请参阅“”。我不知道这是Ruby的意图还是一个bug,但请尝试下面的代码。此代码在Ruby 2.5.1版上运行,并在Linux系统上运行
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
放置1>-1和257<256
#=>错误
放置1>-1&&257<256
#=>正确
最好指定一个人通常应该使用&&
,而和应该只用于非常特定的情况。这里还有一个很好的解释:。来自Andrew Marshall的链接:“另一种思考和
的方法是将if
语句修饰符反转为:next if widget=widgets.pop
变成widget=widgets.pop和next
。这是一个很好的表达方式,真的让它在我的脑海里“咔哒”一声。(和或
类似于一个反向的,除非
修饰语。)将这个答案与塔德曼答案的细节结合起来,你就能了解整个情况。Avdi更新了他对何时使用和与的看法。对于控制流,基本上使用“and”和“or”,因为它们的优先级较低。另请参见。实际上,要完全避免和
/或
,它们可能是有道理的。通常它们在控制流中的用法(例如,document.save!除非document.saved?
)@akostadinov,以防您不使用:Ruby样式指南不是由Ruby的创建者编写的。Ruby是由松本幸弘和其他人创建的,而Ruby风格指南是由Bozhidar Batsov创建的。@Andrewgrim,谢谢,很高兴知道。很抱歉,我对ruby reality的某些方面感到困惑。有一点是肯定的——每个ruby项目都需要严格的样式策略来保持代码库的可维护性。“与|
不同,或的优先级低于=
”……现在它更有意义了,谢谢a=foo和bar
和(a=foo)&&bar
证明了和的优先级低于&
。我不明白:“foo和bar”的意思是什么?a=foo和bar
等同于(a=:foo)和nil
。由于赋值返回一个逻辑上为真的值(:foo
),因此第二部分求值失败,返回nil
。谢谢,但是“and”的优先级与“&&&”的优先级有何不同?@BKSpurgeon请参阅Ruby中运算符优先级的有序列表。@JakubArnold Sarcasm没有任何帮助。例如,博布罗德斯:这不是讽刺。有7个答案,其中6个已经有了例子。@JakubArnold我仍然觉得这个例子很有用。我也得到了一些奇怪的结果。v1=true和false p v1#=>app.rb:true,IRB:false v2=true和false p v2#=>app.rb:false,IRB:false放置1>-1和257<256#=>app.rb:false,IRB:false