Как я могу реализовать цепной метод для моего класса? - PullRequest
0 голосов
/ 25 ноября 2018

Я работаю со строкой, которую нужно преобразовать в двухмерный массив:

rows = [['1', '2'], ['10', '20']]

Мне нужны эти значения как целые числа вместо строк.Я могу перебрать их, а затем выполнить map, например:

rows.each {|row| row.map!(&:to_i)}

Я пытался создать метод to_i, который мог бы быть цепным, чтобы я мог запустить rows.to_i.

def to_i
  each do |nested|
    nested.map!(&:to_i)
  end
end

Это неудивительно, что это не так:

NoMethodError: undefined method `to_i' for [["1", "2"], ["10", "20"]]:Array

, поскольку Array не реализует метод.Помимо исправления обезьяны класса Array, существует ли более правильный или более правильный способ сделать это?

Другой альтернативой является:

def ary_to_i array
  array.each do |nested|
    nested.map!(&:to_i)
  end
end

, но я нашел вызов метода ary_to_i(rows) сбивает с толку.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вы можете определить метод to_i только для строк:

rows = [['1','2'], ['10','20']]

def rows.to_i
  each do |nested|
    nested.map!(&:to_i)
  end
end

p rows.to_i # => [[1, 2], [10, 20]]
0 голосов
/ 25 ноября 2018

Несмотря на то, что это анти-паттерн, вы можете обезьяньим патчем класс Array:

class Array
  def to_i
    map do |nested|
      nested.map(&:to_i)
    end
  end
  def to_i!
    each do |nested|
      nested.map!(&:to_i)
    end
  end
end

Но я бы лучше выбрал последний вариант в OP.


Sidenote: Мутирующие массивы - не лучшая идея, но если вы это сделаете, выберите имя, оканчивающееся ударом, как в моем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...