2011-10-05 46 views
2

我有一个数组date_array。如果i0,我想date_array[i-1]返回nil或例外。我以为我可以为此派生一个Array的子​​类,但我不确定在那之后要去哪里。有任何想法吗?需要禁止数组中的负指数值

回答

3

你可以做到这一点,但你不应该需要。我觉得你错了,因为责任是你的,而不是Array的,来检查被传递的索引值。

仅仅是一个例子

def get_array_value (i) 
    return data_array[i - 1] unless i < 0 
    return nil 
end 

但是,如果你坚持,该解决方案可以为你工作。

# arr = SpecialArray.new([1, 2, 3, 4, 5]) 

class SpecialArray < Array 

    def [](i) 
    return super(i) unless i < 0 
    return nil 
    end 

end 
+0

是的,改变直接调用数组通过[]到一个函数(就像你上面)一样正常工作。谢谢。 – davej

0

好吧,我同意亚当,这将会是理想的控制指标,而不是这样做:

class Ary < Array 
    def [](i) 
     return nil if i < 0 
     super 
    end 
end 

a = Ary.new([1, 2, 3]) 
b = Array.new([1, 2, 3]) 

#try access with -1 (normally would show last) 
p a[-1] #=> nil 
p b[-1] #=> 3 
0

我想你可能被错误地做事情。这就是说:

你可以使用散列而不是数组。哈希不会重新解释hash[-1]意思是别的。

0

您可以重写默认数组的行为。请注意,当索引超出限制时,Array #fetch方法会引发异常。您可以将该方法包装在#[]中。这里是一个例子

class Array 
    def [](index) 
    self.fetch(index) 
    end 
end 

现在,它应该只是工作。额外的好处是,你不需要实施任何新的东西。只需使用现有的标准实现即可。