ruby在or-operator中有2个以上的替代品

时间:2017-03-05 15:40:56

标签: ruby

我有这行代码:

if self.include?("van " || "de " || "von ")

为什么在or-operator的第三个替代项为真时执行此行后包含的块?

当我的字符串为"von wartburg"时,该块不会执行,但当我的字符串包含"van""de"时,它就会执行。

4 个答案:

答案 0 :(得分:3)

self.include?("van " || "de " || "von ")

始终 评估为

self.include?("van ")

为什么呢?因为||的工作原理。

"van " || "de " || "von "
# ↑↑↑↑↑↑ evaluates to "van " and does not give a slightest shoe about the rest

参见String#include - 它接受子串和偏移作为参数。

您需要的是以下内容:

["van ", "de ", "von "].any? { |substring| self.include?(substring) }

答案 1 :(得分:1)

'或'将始终评估“van”because of how || works

尝试使用正则表达式,如:

self =~ /^(van\ |de\ |von\ )/

答案 2 :(得分:0)

我认为你想要的是

if self.include?("van ") || self.include?("de ") || self.include?("von ")

||的调用中使include?使其仅评估第一个字符串。您想为每个案例测试include?

答案 3 :(得分:0)

它不适用于" de"任

2.3.0 :004 > "van test".include?("van " || "de " || "von ")
 => true
2.3.0 :005 > "de test".include?("van " || "de " || "von ")
 => false
2.3.0 :006 > "von test".include?("van " || "de " || "von ")
 => false

当您运行String#include?("van " || "de " || "von ")时 你只将一个参数传递给函数:"van " || "de " || "von "

布尔值OR(||)将返回列表中评估为true的第一个元素。所以这与String#include?("van ")完全相同。

我知道只有两种方法可以在一行中做你想做的事情:

  • 您可以创建一个子字符串表来测试并使用any?

    ["van ", "de ", "von "].any? { |s| string.include?(s) }

  • 或者您可以使用正则表达式(其中或运算符(|)完全符合您的要求)

    /van |de |von / =~ string