【问题标题】:Ruby: Chaining methods give different results: .chars.popRuby:链接方法给出不同的结果:.chars.pop
【发布时间】: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.poppop(数组的最后一个元素)的结果存储在a 中,而a="***".chars ; a.pop 首先将chars 的结果存储在a(数组本身)中,然后删除其最后一个元素。在这里,pop(最后一个元素)的结果被丢弃。通过重新分配结果,您会得到相同的结果:a = a.pop

标签: ruby char chaining


【解决方案1】:
a = "***".chars.pop
# => "*"
a
# => "*"

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

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

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

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

a.pop
# => "*"

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

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

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

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

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

a.chars.pop
# => "*"

和以前一样,您从字符串中获取一个字符数组(它再次没有以任何方式连接到原始字符串)并删除返回的最后一个元素。 a.chars 返回的中间数组被丢弃。

a
# => "***"

由于您只修改了中间数组而没有修改原始字符串,a 没有改变。


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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多