修改从“数组”继承的类的接收器



我有一个类:

class MyArray < Array; end

我想定义一个将更改MyArray实例的方法,以便:

arr = MyArray.new([1,2,3,4]) # => [1, 2, 3, 4]
arr.inc # => [2, 3, 4, 5]`

能做到吗?怎么会这样?

我试过了:

class MyArray < Array
  def inc
    self.each { |i| i = i + 1 }
  end
end
如果您希望

#inc就地改变 MyArray 实例,则可以使用常规下标语法将修改后的元素写回self

class MyArray
  def inc
    self.each_with_index { |el, idx| self[idx] = el + 1 }
    self
  end
end

如果你想返回一个新的MyArray实例,你应该使用 #map ,它返回一个常规Array,所以把它包装在类的构造函数中:

class MyArray
  def inc
    self.class.new(self.map { |i| i + 1 })
  end
end
class MyArray < Array
  def inc
    each_index{|i| self[i] += 1}
  end
end
arr = MyArray.new([1, 2, 3, 4])
arr.inc # => [2, 3, 4, 5]

class MyArray < Array
  def inc
    replace(map(&:succ))
  end
end
arr = MyArray.new([1, 2, 3, 4])
arr.inc # => [2, 3, 4, 5]

最新更新