【问题标题】:Ruby Array mutation confusion?Ruby Array 突变混乱?
【发布时间】:2016-04-22 23:48:04
【问题描述】:

我正在尝试对 Ruby 中的所有数组方法和可枚举项感到非常熟悉,但我不明白为什么有些不会发生变异而另一些会发生变异。例如,两者之间是否有区别:

def double(array)
  array.map {|x| x * 2}
end

def double(array)
  return array.map! {|x| x * 2}
end

另外,当我试图打电话时

 b.select{|x| x.even?} 

其中b是一个整数数组,它没有改变,但是

  b = b.select{|x| x.even?} OR
 .delete_if

似乎确实改变了它。

a.each do |word|
 word.capitalize!
end

a.map do |word|
 word.capitalize
end

【问题讨论】:

    标签: arrays ruby ienumerable


    【解决方案1】:

    根据经验,ruby methods that end in ! will mutate the value they are called on 和没有的方法将返回一个变异副本。

    在此处查看map vs map!capitalize vs capitalize! 的文档

    另请注意,b = b.select{|x| x.even?} 不会改变列表 b,而是调用 b.select 来创建一个全新的列表,并将该列表分配给 b。注意区别:

    在此,b 是同一个对象,只是改变了:

    $ irb
    @irb(main):001:0> b = [1,2,3]
    => [1, 2, 3]
    @irb(main):002:0> b.object_id
    => 69853754998860
    @irb(main):003:0> b.select!{|x| x.even?}
    => [2]
    @irb(main):004:0> b.object_id
    => 69853754998860
    

    但在这里,b 现在是一个全新的对象:

    $ irb
    @irb(main):001:0> b = [1,2,3]
    => [1, 2, 3]
    @irb(main):002:0> b.object_id
    => 70171913541500
    @irb(main):003:0> b = b.select{|x| x.even?}
    => [2]
    @irb(main):004:0> b.object_id
    => 70171913502160
    

    【讨论】:

    • 错字:'大写!'应该是“大写!”。另外,这个例子很好,但是选择可以更简洁: b.select(&:even?)
    • 更简洁,是的,但不太清楚; OP 对两个名称相似的方法调用之间差异的性质感到困惑,向它们抛出一个新概念(如方法处理)不会做任何事情,只会进一步混淆它们。感谢您的拼写错误!
    【解决方案2】:

    两者之间是否有区别:

    def double(array) array.map {|x| x * 2} 结束和

    def double(array) 返回array.map! {|x| x * 2} 结束

    是的。第一个返回一个新数组。第二个修改原始数组,并返回它。

    a.每个都做 |word| word.大写!结尾一样

    a.map 做 |word| word.capitalize 结束

    没有。第一个修改数组中的元素,并返回原始数组。第二个返回一个用新字符串填充的新数组。

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 2021-05-01
      • 2015-11-30
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多