当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

ruby-我应该覆盖哪个数组方法?

admin 126℃
我想扩展一个ruby数组对象,使其返回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的源代码来覆盖什么方法,我试过了,但是很难找到它。

只需像下面这样扩展数组类

class Array
  def to_null_safe!
    each_with_index  do |variable, index|
      self[index] = "HELLO" if variable.nil?
    end
  end
end
class Array
  def to_be_null_safe
    map { |value| value.nil? ? "HELLO" : value }
  end
end

如果需要重写很多方法,也可以考虑使用自定义对象,而不是将 Array 空间。

转载请注明:我的代码 » ruby-我应该覆盖哪个数组方法?