Необходимо запретить отрицательные значения индекса в массиве

#ruby #arrays

#ruby #массивы

Вопрос:

У меня есть массив date_array . Если i есть 0 , я бы хотел date_array[i-1] вернуть nil или исключение. Я думал, что смогу создать подкласс Array для этого, но я не уверен, куда идти после этого. Есть идеи?

Ответ №1:

Вы могли бы это сделать, но вам это не нужно. Я чувствую, что вы поступаете неправильно, поскольку ответственность за проверку передаваемого значения индекса лежит на вас, а не на массиве.

Просто пример

 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. да, изменение прямого вызова массива через [] на функцию (как у вас выше) работает так же хорошо. Спасибо.

Ответ №2:

Что ж, я согласен с Адамом, было бы идеально контролировать индексы вместо этого:

 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
  

Ответ №3:

Я думаю, что вы, возможно, что-то делаете неправильно. При этом:

Вы могли бы использовать хэш вместо массива. Хэши не будут повторно интерпретироваться hash[-1] , чтобы означать что-то другое.