需要禁止数组中的负索引值

时间:2011-10-05 16:25:27

标签: ruby arrays

我有一个数组date_array。如果i0,我希望date_array[i-1]返回nil或例外。我以为我可以为此派生一个Array的子​​类,但我不确定在那之后去哪里。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

你可以这样做,但你不应该这样做。你觉得,这是错误的,因为责任是你的,而不是数组,检查传递的索引值。

仅仅是一个例子

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

答案 1 :(得分:0)

嗯,我同意Adam,理想的是控制索引而不是这样做:

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

答案 2 :(得分:0)

我认为你可能做错了事。话虽如此:

您可以使用哈希而不是数组。哈希不会将hash[-1]重新解释为其他内容。

答案 3 :(得分:0)

您可以覆盖默认Array的行为。请注意,当索引超出范围时,Array #fetch方法会抛出异常。您可以将该方法包装在#[]中。这是一个例子

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

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