我应该覆盖哪种Array方法?

时间:2010-08-25 07:28:55

标签: ruby

我想扩展一个Ruby Array对象,如果它是nil则返回Array.new。

我的解决方案:

覆盖[]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 个答案:

答案 0 :(得分:1)

只需像下面这样扩展Array类

class Array
  def to_null_safe!
    each_with_index  do |variable, index|
      self[index] = "HELLO" if variable.nil?
    end
  end
end

答案 1 :(得分:0)

class Array
  def to_be_null_safe
    map { |value| value.nil? ? "HELLO" : value }
  end
end

如果您需要覆盖大量方法,请考虑使用自定义对象,而不是使Array空间混乱。