我想扩展一个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的源代码来覆盖什么方法,我试过,但是很难找到它。
答案 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
空间混乱。