Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 区别于;及;及&;用红宝石?_Ruby_Operators - Fatal编程技术网

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)

Ruby中的
&
运算符之间有什么区别?

&
相同,但有不同之处。他们都使用


警告:
的优先级甚至低于
=
,因此您通常希望避免使用
。应使用
的示例可在“.”下的导轨中找到。

实际区别在于结合强度,如果您没有准备好,可能会导致特殊行为:

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