Измените получатель класса, который наследуется от `Array` - PullRequest
0 голосов
/ 07 января 2019

У меня есть класс:

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 голосов
/ 08 января 2019
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]
0 голосов
/ 07 января 2019

Вы можете записать измененные элементы обратно в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...