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

问题描述 投票:0回答:1

我想做一个迭代循环,在每一步中,字符串的 "***" 会有一个标志消失(迭代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
=> "***"

所以有时我有 "*",有时 ["*","*"],甚至 "***"... 你能不能解释一下这里发生了什么,什么是最好的方式来实现我想做的事情?非常感谢!

ruby char chaining
1个回答
4
投票
a = "***".chars.pop
# => "*"
a
# => "*"

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

然后,你从字符数组中弹出最后一个元素。Array#pop 现在modofies原始数组(删除最后一个元素)并返回这个元素。因为你是将这个方法的结果分配给你的 a 变量,您可以有效地设置 a = "*". 中间的字符数组和初始字符串都被丢弃。

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

在这里,我们将字符数组分配给了 a 变量(并扔掉初始字符串)。

a.pop
# => "*"

如上所述。Array#pop 返回数组的最后一个元素......

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

...并且修改被调用的数组以删除最后一个元素(即返回的元素)。因此, a 现在只有2个元素,除了最后一个元素外,其他元素都被弹出。

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

这里,你给一个字符串 "***"a variabe。

a.chars.pop
# => "*"

和之前一样,你从字符串中得到一个chartacters数组(它同样与原始字符串没有任何联系),并删除最后一个元素,这就是返回。返回的中间数组是由 a.chars 被丢弃。

a
# => "***"

因为你只修改了中间数组,而没有修改原始字符串。a 是不变的。


现在,似乎你最初只是想删除字符串的最后一个字符。这可以通过以下方法实现。

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

这里,你得到一个新的字符串 b 它基本上是字符串 a 的最后一个字符。

如果你想在原地修改原始字符串(这通常是指 欲望的),你可以例如使用。

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

(注意,虽然 Array#chop! 如果存在,也返回一个尾部的换行。参见 文件 详见,并注意到两者之间的区别。String#chopString#chop!.

© www.soinside.com 2019 - 2024. All rights reserved.