我知道
another answer中显示的优先级有所不同:
p foo = false || true # => true p foo = false or true # => false
但似乎在和|和|之间存在更多不同的东西.
例如:
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)
解决方法
理论:
这是Ruby的precedence table.
从这个表中不清楚,但没有括号的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
警告!
当你遇到优先事项时,你应该小心添加另一个没有括号的put或p!
例如 :
p [1,2,3].map do |i| i*2 end
产出:
#<Enumerator: [1,3]:map>
即使你可能已经预料到:
[2,4,6]