Ruby的%w快捷语法出现异常行为,求原因解析
为什么Ruby中
%w('a b c d e').include? 'e'返回false? 这个问题的核心是你误解了Ruby里%w字面量的工作逻辑,咱们一步步拆解清楚:
首先得明确%w的本质:它是用来快速创建空格分隔的纯字符串数组的语法糖,不需要给每个元素加引号——你加了引号的话,引号会被当成字符串内容的一部分,而不是语法标记!
先看你写的错误代码:
x = %w('a b c d e') # 打印数组看看实际内容: puts x.inspect # 输出:["'a", "b", "c", "d", "e'"]
看到没?数组的第一个元素是'a(带开头的单引号),最后一个元素是e'(带结尾的单引号),只有中间的b、c、d是不带引号的纯字符串。这就解释了为什么你测试时中间元素返回true,首尾返回false——你要找的是纯字符串'e',但数组里的最后一个元素是e',两者根本不相等!
再对比你最开始的正确写法:
['a', 'b', 'c', 'd', 'e'].include? 'e' # => true
这个数组里的所有元素都是不带引号的纯字符串,所以判断'e'自然能匹配上,返回true。
那正确的%w写法应该是去掉内部的单引号:
x = %w(a b c d e) puts x.inspect # 输出:["a", "b", "c", "d", "e"] x.include? 'e' # => true
这样生成的数组就和你最开始的手动定义数组完全一致了。
你之前误以为x.include? 'e'返回true,应该是测试时的疏漏——比如你可能不小心把判断条件写成了x.include? "e'"(带上了结尾的引号),才会得到true的结果;而当你用纯'e'去判断时,自然就返回false了~
内容的提问来源于stack exchange,提问作者BobRodes
相关产品推荐
相关产品推荐

