我刚刚发现以下奇怪的行为String#split
:
"a\tb c\nd".split
=> ["a", "b", "c", "d"]
"a\tb c\nd".split(' ')
=> ["a", "b", "c", "d"]
"a\tb c\nd".split(/ /)
=> ["a\tb", "c\nd"]
来源 https://github.com/ruby/ruby/blob/v2_0_0_0/string.c#L5869(string.c from 2.0.0) 超过 200 行长,包含如下段落:
/* L 5909 */
else if (rb_enc_asciicompat(enc2) == 1) {
if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' '){
split_type = awk;
}
}
后来,在代码中awk
split 类型,实际参数甚至不再使用,并且与普通参数的作用相同split
.
- 还有其他人觉得这在某种程度上被破坏了吗?
- 这有充分的理由吗?
- 在 Ruby 中,这样的“魔法”是否比大多数人想象的更频繁?
和Perl的一致split()
行为。这又是基于Gnu awk's http://www.gnu.org/software/gawk/manual/html_node/String-Functions.html split()
。所以这是一个起源于 Unix 的长期传统。
来自perldoc http://perldoc.perl.org/functions/split.html on split
:
作为另一个特殊情况, split 模拟了默认行为
当 PATTERN 被省略或为文字时,命令行工具 awk
由单个空格字符组成的字符串(例如 ' ' 或 "\x20" ,
但不是例如//)。在这种情况下,EXPR 中的任何前导空格都是
在分割发生之前被删除,并且 PATTERN 被视为
如果是 /\s+/ ;特别是,这意味着任何连续的
空格(不仅仅是单个空格字符)用作分隔符。
然而,这种特殊处理可以通过指定
//pattern代替字符串“”,从而只允许单个
空格字符作为分隔符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)