Ruby&&运营商结果不要有意义

时间:2011-05-31 19:09:08

标签: 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

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

2 个答案:

答案 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")