ruby – 为什么写或者不是||?
发布时间:2020-12-17 03:50:24 所属栏目:百科 来源:网络整理
导读:我知道 another answer中显示的优先级有所不同: p foo = false || true# = truep foo = false or true# = false 但似乎在和|和|之间存在更多不同的东西. 例如: p foo = 42 or raise "Something went wrong with foo"# = 42p foo = nil or raise "Something
我知道
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] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |