修改继承自Array的类的接收者

时间:2019-01-07 18:14:23

标签: arrays ruby

我有一堂课

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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]