首页 > 解决方案 > 修改继承自`Array`的类的接收者

问题描述

我有一堂课:

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

标签: arraysruby

解决方案


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

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

推荐阅读