【发布时间】:2020-06-02 12:18:46
【问题描述】:
我想创建一个迭代循环,在每个步骤中,字符串 "***" 的符号都会消失(迭代 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 = a[0..-2]实现您的目标。 -
#pop返回被移除的元素,所以"***".chars.pop会返回被移除的元素,所以a变成"*" -
喜欢它。但是知道为什么链接方法会给出不同的结果吗?
-
解释“链接方法与否给出不同的结果”?询问有关它的具体问题。我仍然不知道你在这里期待什么。
-
@FrançoisCapel "为什么链接方法或不给出不同的结果" - 这是因为数组是可变的,
pop修改了数组的状态。a="***".chars.pop将pop(数组的最后一个元素)的结果存储在a中,而a="***".chars ; a.pop首先将chars的结果存储在a(数组本身)中,然后删除其最后一个元素。在这里,pop(最后一个元素)的结果被丢弃。通过重新分配结果,您会得到相同的结果:a = a.pop。