Ruby &&运算符结果不要有意义

Noa*_*ark 2 ruby operators

这是我的代码:

>> x = "apple spoon"
=> "apple spoon"

>> y = "spoon tree"
=> "spoon tree"

>> z = "apple tree"
=> "apple tree"

>> puts "match" if x.upcase.match("APPLE" && "SPOON" && "TREE")
=> nil

>> puts "match" if y.upcase.match("APPLE" && "SPOON" && "TREE")
match
=> nil

>> puts "match" if z.upcase.match("APPLE" && "SPOON" && "TREE")
match
=> nil
Run Code Online (Sandbox Code Playgroud)

我期望发生的事情根本就是没有任何比赛.为什么我会在y和z上获得匹配?

DGM*_*DGM 7

正如dmarkow所说,&&运算符用于布尔运算,而不是为match()赋予多个参数.

如果您需要查找它是否与任何字符串匹配,请使用某种迭代器,例如:

puts "MATCH" if ["TREE","SPOON"].any? {|t| z.upcase.match(t)}
Run Code Online (Sandbox Code Playgroud)

另外,由于String#match接受正则表达式,我认为你可以做一个不区分大小写的正则表达式:

puts "MATCH" if ["TReE","SPoOn"].any? {|t| z.match(/#{t}/i)}
Run Code Online (Sandbox Code Playgroud)

或者你可以:

puts "MATCH" if z.match(/(tree|spoon)/i)
Run Code Online (Sandbox Code Playgroud)

既然你说你想匹配所有条款:

puts "MATCH" if ["TReE","SPoOn"].all? {|t| z.match(/#{t}/i)}
Run Code Online (Sandbox Code Playgroud)

如果正则表达式让您感到困惑,并且您希望首先进行大写:

puts "MATCH" if ["TREE","SPOON"].all? {|t| z.upcase.match(t)}
Run Code Online (Sandbox Code Playgroud)


Dyl*_*kow 6

一个&&声明或者返回假,或声明的最后一个值:

false && "SPOON"
# => false
"TREE" && "SPOON"
# => "SPOON"
Run Code Online (Sandbox Code Playgroud)

所以,你的陈述正在评估与此相同:

puts "match" if y.upcase.match("TREE")
Run Code Online (Sandbox Code Playgroud)