Какой метод массива я должен перезаписать? - PullRequest
1 голос
/ 25 августа 2010

Я хотел бы расширить объект Ruby Array, чтобы он возвращал Array.new, если он равен nil.

Мое решение:

Перезаписать [] и at.

module NullSafeArray
  def at(index)
    value = super
    return Array.new if value.nil?
    value
  end

  def [](index)
    value = super
    return Array.new if value.nil?
    value
  end
end

Проблема:

Это работает:

assert_equal Array.new [].to_be_null_safe[3]

Но это не удастся:

a, b = [nil, 2].to_be_null_safe
assert_equal Array.new, a

Какой еще метод должен быть перезаписан для этого?

Обновление:

Ваш ответ должен пройти это:

a, b = [9].to_null_safe
assert a == 9
assert b == Array.new

Это может быть a, b, c, d =. Вы не знаете, сколько там запятой.

Полагаю, вы знаете, какой метод перезаписать, глядя на исходный код Ruby, я пробовал, но найти его довольно сложно.

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Просто расширьте класс Array, как показано ниже

class Array
  def to_null_safe!
    each_with_index  do |variable, index|
      self[index] = "HELLO" if variable.nil?
    end
  end
end
0 голосов
/ 25 августа 2010
class Array
  def to_be_null_safe
    map { |value| value.nil? ? "HELLO" : value }
  end
end

Также рассмотрите возможность использования пользовательского объекта, если вам нужно переопределить множество методов, вместо того, чтобы загромождать пространство Array.

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