Ruby:链接方法给出不同的结果:.chars.pop

Ruby: Chaining methods give different results: .chars.pop

我想创建一个迭代循环,其中字符串 "***" 的每一步都会有一个符号消失(迭代 2:"**",迭代 3:"*")。我在 irb 中尝试了不同的方法,结果似乎无处不在!

[14] pry(main)> a="***".chars.pop
=> "*"
[15] pry(main)> a
=> "*"
[16] pry(main)> a="***".chars
=> ["*", "*", "*"]
[17] pry(main)> a.pop
=> "*"
[18] pry(main)> a
=> ["*", "*"]
[19] pry(main)> a="***"
=> "***"
[20] pry(main)> a.chars.pop
=> "*"
[21] pry(main)> a
=> "***"

所以有时我有 "*",有时 ["*","*"],甚至 "***"... 到底是什么?您能否解释一下这里发生的事情以及实现我想要做的事情的最佳方法是什么?万分感谢!

a = "***".chars.pop
# => "*"
a
# => "*"

在这里,您获取字符串 "***",并使用 "***".chars 收集其字符数组。字符数组(即一个字符的字符串)与原始字符串没有任何联系。

然后,您从字符数组中弹出最后一个元素。 Array#pop 现在修改原始数组(删除最后一个元素)并 return 删除这个元素。由于您将此方法的结果分配给 a 变量,因此您有效地设置了 a = "*"。中间的字符数组和初始字符串都被丢弃了。

a = "***".chars
# => ["*", "*", "*"]

在这里,您将字符数组分配给 a 变量(并丢弃初始字符串)。

a.pop
# => "*"

如上所述,Array#pop return 数组的最后一个元素...

a
# => ["*", "*"]

... 并且它修改调用它的数组以删除最后一个元素(即 returned 的那个)。因此,a 现在只有 2 个元素,除了最后一个元素之外的所有元素都弹出。

a = "***"
# => "***"

在这里,您将字符串 "***" 分配给 a 变量。

a.chars.pop
# => "*"

和以前一样,您从字符串中得到一个字符数组(它也没有以任何方式连接到原始字符串)并删除最后一个 returned 的元素。由 a.chars 编辑的中间数组 return 被丢弃。

a
# => "***"

因为你只修改了中间数组,没有修改原始字符串,所以a没有改变。


现在,您最初似乎只想删除字符串的最后一个字符。这可以通过以下方式完成:

a = "***"
b = a[0,-2]

在这里,您得到一个新字符串 b,它基本上是字符串 a 的副本,删除了最后一个字符。

如果你想就地修改原始字符串(这通常是 可取的),你可以例如使用:

a = "***"
a.chop!
a
# => "**"

(请注意,Array#chop! 也是一个尾随换行符(如果存在)。请参阅 the documentation 了解详细信息,并注意 String#chopString#chop! 之间的区别.