加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 23:12:22 所属栏目:百科 来源:网络整理
导读:我刚刚发现了String#split的以下奇怪行为: "atb cnd".split= ["a","b","c","d"]"atb cnd".split(' ')= ["a","d"]"atb cnd".split(/ /)= ["atb","cnd"] The source(string.c from 2.0.0)超过200行,包含如下所示的段落: /* L 5909 */else if (rb_enc
我刚刚发现了String#split的以下奇怪行为:
"atb cnd".split
=> ["a","b","c","d"]

"atb cnd".split(' ')
=> ["a","d"]

"atb cnd".split(/ /)
=> ["atb","cnd"]

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读