Ruby的%w快捷方式的奇怪行为

时间:2019-01-18 20:19:15

标签: ruby

这按预期工作,返回true

['a', 'b', 'c', 'd', 'e'].include? 'e'

这也符合我的预期,并返回true

x = %w('a b c d e')
x.include? 'e' # => true

但这无法正常工作,返回false

%w('a b c d e').include? 'e'

最奇怪的部分是第一个或最后一个值返回false,而内部值返回true。我用3到5个字符的字符串进行了尝试,结果相同。

为什么?

编辑:iGian要求我检查x.include? 'e'是否真的评估为true。没有。现在,当我尝试这种情况时,我没有将字符加引号!我认为我需要增加屏幕字体大小或购买新眼镜。因此,%w ('a b c')中的值为'abc'。这就很好地解释了为什么我得到发现的行为。

1 个答案:

答案 0 :(得分:7)

如果将其放入irb中,然后看看Ruby的想法,答案就很明显了:

%w('a b c d e')
# => ["'a", "b", "c", "d", "e'"]

它不包含e,而是包含e',因为您使用的%w错误。

使用%w时删除引号。它以空格分隔,而不是引号。任何非空格字符都被视为字符串的一部分,并“粘在”它们的相邻字母上。