我有一个Rails项目,其中一个类有:
def include_stuff?(str)
str.include? '.' || str.include? '-'
end
哪个只是给我:
syntax error, unexpected tSTRING_BEG, expecting keyword_end (SyntaxError)
cpf.include? '.' || cpf.include? '-'
^
我将代码更改为:
def include_stuff?(str)
str.include? '.' or str.include? '-'
end
没有抛出任何错误。
我也尝试了这一点,并取得了成功:
def include_stuff?(str)
str.include?('.') || str.include?('-')
end
为什么Ruby不能用双管道理解语句,但可以理解or
运算符的语句。
我正在使用Ruby 2.2.2
答案 0 :(得分:3)
||
和or
在Ruby中并不相同(请参阅Difference between "or" and || in Ruby?)。
所以你的陈述:
str.include? '.' or str.include? '-'
实际上相当于:
str.include?('.' || str.include?('-'))
答案 1 :(得分:2)
这与运营商优先级有关。 or
远低于||
。
它正在尝试将cpf.include? '.' || cpf.include? '-'
解析为cpf.include?('.' || cpf.include? '-' )
并因第二个include?
没有括号而感到困惑。
"Custom filter:" example of the input key filter
注意or
和||
不是一回事。
请参阅http://www.techotopia.com/index.php/Ruby_Operator_Precedence
结论
and
和or
尽管与&&
和||
明显相似,却扮演着截然不同的角色。和/或是控制流修饰符,如if
和unless
。当以这种身份使用时,他们的低优先权是美德而不是烦恼。