Ruby中字符串的 #split("") 和 #chars 有什么区别?

14
在Ruby中,当分割字符串时,#split和#chars有什么区别?
"Hello, World".split("")
#=> ["H", "e", "l", "l", "o", ",", " ", "W", "o", "r", "l", "d"]

"Hello, World".chars
#=> ["H", "e", "l", "l", "o", ",", " ", "W", "o", "r", "l", "d"]

它们都返回一个数组,而且它们都包含空格和标点符号。

是否有一种情况更适合使用其中一种?


1
它们具有相同的效果,因此没有一个更可取。你可以对第三个选项说同样的话:"Hello, World".split(//)。请注意,通常使用"Hello, World".split,因为它等同于"Hello, World".split(/[ \t\n\r\f\v]+/),因为它会在包含任何数量和组合的空格、制表符、换行符、进纸符等字符串上进行拆分。 - Cary Swoveland
还有一件事,对于 str = "Hello, World",假设你写了 str.chars.map(&:upcase) #=> ["H", "E", "L", "L", "O", ",", " ", "W", "O", "R", "L", "D"]。像 Enumerable 模块中的所有方法一样,map 的接收者是一个 Enumerator,所以在 Ruby 内部使用 Array#each 来执行 str.chars.each.map(&:upcase)... - Cary Swoveland
更高效的方法是直接使用String#each_char,当不使用块时,它返回一个枚举器(而不是构造一个临时数组)。对于所有的Enumerable方法m,你应该写成str.each_char.m - Cary Swoveland
2个回答

16

splitchars 的区别是什么?

string.chars 解析底层字节以返回字符串的字符,而 string.split('') 使用正则表达式来实现同样的功能。

因此,chars 更快和更可靠。即使字符串包含无效字符,它也能正常工作:

"foo\x80bar".chars
#=> ["f", "o", "o", "\x80", "b", "a", "r"]

如果字符串格式不正确(因为正则表达式引擎无法处理它),split 就会失败:

"foo\x80bar".split('')
#=> ArgumentError: invalid byte sequence in UTF-8
如果我没记错的话,split('')等同于split(//)
"有哪些情况下可以优先选择其中一种方法?" split('')出现在许多教程中。我猜这是因为在 Ruby 2.x 之前,chars返回一个枚举器。所以为了获得一个数组,你必须使用两个方法调用:
string.chars.to_a

或者只需要一个调用:(这也略微更短)

string.split('')

现今,你可以使用chars(或each_char来保留早期2.x版本的行为)。


5
您可以使用split根据分隔符将字符串分割成子字符串。
例如:
"a/b-c".split('/') will return ["a", "b-c"]

chars代替返回字符串中的字符数组

"a/b-c".chars will return ["a", "/", "b", "-", "c"]

总之,有很多情况下一个比另一个更合适。

3
根据这个例子,我认为原帖只关心 split 函数在参数为空字符串时的情况。如果是这样,那么回答并没有解决问题。请问,clockworkpc,能否澄清一下?另外,为什么要急着选择一个答案呢?难道您不想看到其他的回答吗? - Cary Swoveland
他的问题中最后一行“是否有一个场景更可取?”怎么样?上面的例子就是其中之一。 - SgtPepper
@CarySwoveland,抱歉我的OP不够明确,但SgtPepper说得对:我所指的“是否存在一种情况……?”是这样的:除了这个例子之外,是否存在一种情况,#split比#chars更可取?也就是说,我可以在其中一个方面做些什么(或做得更好)吗?SgtPepper提供了这样的回答。 - clockworkpc
clockworkpc,这没有意义。当split的参数不是空格时,使用chars比使用split更好,就像使用upcase一样:在这种情况下,splitupcase都没有split的功能。 “更好”只应在比较两个都能完成工作的事物时使用。 - Cary Swoveland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接