ruby – 为什么分裂(”)试图(太)聪明?

前端之家收集整理的这篇文章主要介绍了ruby – 为什么分裂(”)试图(太)聪明?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚发现了String#split的以下奇怪行为:
"a\tb c\nd".split
=> ["a","b","c","d"]

"a\tb c\nd".split(' ')
=> ["a","d"]

"a\tb c\nd".split(/ /)
=> ["a\tb","c\nd"]

The source(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类型的代码中,实际参数甚至不再使用,并且与普通拆分相同.

>有没有人觉得这有点破碎?
>这有充分的理由吗?
>像这样的“魔术”是否比大多数人在Ruby中想到的更频繁?

解决方法

它与Perl的split()行为一致.而这又基于 Gnu awk‘s split().所以这是源于Unix的悠久传统.

perldoc分裂:

As another special case,split emulates the default behavior of the command line tool awk when the PATTERN is either omitted or a literal string composed of a single space character (such as ‘ ‘ or “\x20″,but not e.g. / / ). In this case,any leading whitespace in EXPR is removed before splitting occurs,and the PATTERN is instead treated as if it were /\s+/ ; in particular,this means that any contiguous whitespace (not just a single space character) is used as a separator. However,this special treatment can be avoided by specifying the pattern / / instead of the string ” ”,thereby allowing only a single space character to be a separator.

猜你在找的Ruby相关文章