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