我有这行代码:
if self.include?("van " || "de " || "von ")
为什么在or-operator的第三个替代项为真时执行此行后包含的块?
当我的字符串为"von wartburg"
时,该块不会执行,但当我的字符串包含"van"
或"de"
时,它就会执行。
答案 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)
答案 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