【问题标题】:How to modify an array subset in Ruby iteratively?如何迭代地修改 Ruby 中的数组子集?
【发布时间】:2013-11-26 07:15:12
【问题描述】:

我知道在 Ruby 中执行 for 循环的惯用方法是使用像 .each 这样的枚举器,但我遇到了一个问题:我想遍历数组的子集并修改那些元素。用ary[0..2].slice(0..2) 之类的子集调用.map! 似乎并没有这样做;大概是因为那个切片操作符正在创建一个新数组?

使用 for 而不是迭代器的期望行为:

iter_ind = [2,3,4]
my_ary = [1,3,5,7,9,11]
for j in iter_ind
  my_ary[j] = my_ary[j] + 1
  # some other stuff like an exchange operation maybe
end
=> [1, 3, 6, 8, 10, 11]

不起作用的事情:

irb(main):032:0> ar[2..4].map! {|el| el = el+1}
=> [6, 8, 10]
irb(main):033:0> ar
=> [1, 3, 5, 7, 9, 11]
irb(main):034:0> ar.slice(2..4).map! {|el| el = el+1}
=> [6, 8, 10]
irb(main):035:0> ar
=> [1, 3, 5, 7, 9, 11]
irb(main):036:0> ar[2..4].collect! {|el| el = el+1}
=> [6, 8, 10]
irb(main):037:0> ar
=> [1, 3, 5, 7, 9, 11]

【问题讨论】:

  • 感谢编辑,我一定是不小心点击了建议的标签。

标签: ruby arrays loops iterator


【解决方案1】:

试试这个。

在下面的示例中,我实现了可以命名为map_with_index 的东西。 each_with_index 如果没有给出块返回迭代器。我用它来映射我们的数组。

ary = [1, 3, 5, 7, 9, 11]   
ary.each_with_index.map { |elem, index| index.between?(2, 4) ? elem += 1 : elem } 
# => [1, 3, 6, 8, 10, 11]

【讨论】:

    【解决方案2】:

    也可以尝试以下方法:

    ?> ary = [1, 3, 5, 7, 9, 11]
    => [1, 3, 5, 7, 9, 11]
    
    ?> ary.map!.with_index {|item, index| index.between?(2, 4) ? item += 1 : item}
    => [1, 3, 6, 8, 10, 11]
    
    ?> ary
    => [1, 3, 6, 8, 10, 11]
    

    【讨论】:

      【解决方案3】:

      如果您不介意引用数组两次,可以使用 Array#each_index

      ary = [1, 3, 5, 7, 9, 11]
      ary.each_index { |i| ary[i] += 1 if i.between? 2, 4 }
      #=> [1, 3, 6, 8, 10, 11]
      

      或者,如果您不想迭代整个数组,这也可以:

      ary = [1, 3, 5, 7, 9, 11]
      ary[2..4] = ary[2..4].map { |el| el + 1 }
      ary
      #=> [1, 3, 6, 8, 10, 11]
      

      【讨论】:

      • 多重引用对速度有显着影响吗?
      • 这种情况下应该会更快。
      猜你喜欢
      • 2010-12-18
      • 2020-05-29
      • 2016-03-26
      • 1970-01-01
      • 2014-02-23
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多