gpt4 book ai didi

ruby - 为什么可以写or却不能写||?

转载 作者:数据小太阳 更新时间:2023-10-29 07:24:27 31 4
gpt4 key购买 nike

我知道优先级有所不同,如 another answer 所示。 :

p foo = false || true
# => true

p foo = false or true
# => false

但是 or|| 之间似乎还有更多不同之处。

例如:

p foo = 42 or raise "Something went wrong with foo"
# => 42
p foo = nil or raise "Something went wrong with foo"
# => Something went wrong with foo (RuntimeError)
p foo = 42 || raise "Something went wrong with foo"
# => syntax error, unexpected tOP_ASGN, expecting end-of-input

我期望得到:

p foo = 42 or raise "Something went wrong with foo"
# => 42
p foo = nil or raise "Something went wrong with foo"
# => Something went wrong with foo (RuntimeError)
p foo = 42 || raise "Something went wrong with foo"
# => Something went wrong with foo (RuntimeError)

但这是一个语法错误。那么发生了什么?

最佳答案

理论:

这是一个 precedence table用于 ruby 。

从这个表中看不出来,但是不带括号的Ruby方法调用的优先级低于||=,但高于 .看这个question .

因此对于您的代码,从最高到最低的优先级:

  • ||
  • =
  • 提出“某事”

表达

foo = 42 or raise "Something went wrong with foo"

先到= :

( foo = 42 ) or raise "Something went wrong with foo"

然后加注:

( foo = 42 ) or ( raise "Something went wrong with foo" )

然后:

( ( foo = 42 ) or ( raise "Something went wrong with foo" ) )

||表达

foo = 42 || raise "Something went wrong with foo"

先到||:

foo = ( 42 || raise ) "Something went wrong with foo"

这是你的语法错误!

你想要:

foo = 42 || (raise "Something went wrong with foo") #=> 42

foo = 42 || raise("Something went wrong with foo")  #=> 42

或者只是

foo = 42 || raise 

警告!

当你遇到优先级问题时,你应该小心添加另一个没有括号的 putsp !

例如:

p [1,2,3].map do |i|
i*2
end

输出:

#<Enumerator: [1, 2, 3]:map>

即使您可能已经预料到:

[2, 4, 6]

关于ruby - 为什么可以写or却不能写||?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309008/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com