通过索引拒绝Ruby数组元素的惯用方法

a0zr77ik  于 2022-11-04  发布在  Ruby
关注(0)|答案(3)|浏览(117)

给定一个Ruby数组ary1,我想生成另一个数组ary2,它与ary1具有相同的元素,除了那些在给定的ary1索引处的元素。
我可以将此功能monkey-patch到Ruby的Array类上,方法是

class Array
  def reject_at(*indices)
    copy = Array.new(self)
    indices.uniq.sort.reverse_each do |i|
      copy.delete_at i
    end
    return copy
  end
end

我可以这样使用它:

ary1 = [:a, :b, :c, :d, :e]
ary2 = ary1.reject_at(2, 4)
puts(ary2.to_s) # [:a, :b, :d]

虽然这样做很好,但我感觉我一定遗漏了一些明显的东西。**Ruby中是否已经内置了一些类似的功能?**例如,Array#slice可以且应该用于此任务吗?

yizd12fk

yizd12fk1#

不要认为有一个内置的解决方案。想出了以下内容:

ary1 = [:a, :b, :c, :d, :e]
indexes_to_reject = [1,2,3]

ary1.reject.each_with_index{|i, ix| indexes_to_reject.include? ix }
cuxqih21

cuxqih212#

相反,有Array#values_at。您可以通过反转索引来使用它以选择:

class Array
  def values_without(*indices)
    values_at(*((0...size).to_a - indices))
  end
end

[:a, :b, :c, :d, :e].values_without(2, 4)

# => [:a, :b, :d]
eaf3rand

eaf3rand3#

您可以使用reject.with_index

ary1 = [:a, :b, :c, :d, :e]

ary1.reject.with_index { _2.in?([2,4]) }
=> [:a, :b, :d]

相关问题