这是我的代码:
>> 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
我期望发生的事情根本不是任何比赛。为什么我会在y和z上获得匹配?
答案 0 :(得分:7)
正如dmarkow所说,&& operator用于布尔运算,不为match()提供多个参数。
如果您需要查找它是否与任何字符串匹配,请使用某种迭代器,例如:
puts "MATCH" if ["TREE","SPOON"].any? {|t| z.upcase.match(t)}
另外,由于String#match接受正则表达式,我认为你可以做一个不区分大小写的正则表达式:
puts "MATCH" if ["TReE","SPoOn"].any? {|t| z.match(/#{t}/i)}
或者你可以:
puts "MATCH" if z.match(/(tree|spoon)/i)
因为你说你想匹配所有条款:
puts "MATCH" if ["TReE","SPoOn"].all? {|t| z.match(/#{t}/i)}
如果正则表达式让您感到困惑,并且您想首先进行大写:
puts "MATCH" if ["TREE","SPOON"].all? {|t| z.upcase.match(t)}
答案 1 :(得分:6)
&&
语句将返回false或语句的最后一个值:
false && "SPOON"
# => false
"TREE" && "SPOON"
# => "SPOON"
所以,你的陈述的评价与此相同:
puts "match" if y.upcase.match("TREE")