2015-01-02 4 views
0

У меня есть массив, который хранит запрещенную IP-адрес в моем приложении:Возможно ли иметь многомерные массивы в Ruby?

bannedips = ["10.10.10.10", "20.20.20.20", "30.30.30.30"]

Я хочу добавить больше информации для каждого запрещенного IP-адреса (IP-адреса, запрет временной метки, запрет причины).

Как это сделать в Ruby?

+2

Использование хешей. 'bannedips = [{ip:" 10.10.10.10 ", причина:" bla bla bla "и т. д.}, {...}]' Или если вы хотите быть супер фантазийными и объектно-ориентированными, BannedIP' и сохраните массив из них. – Adrian

+0

@ Идея хэша @ Adrian выглядит хорошо. Что можно/следует использовать для получения отметки времени и причины для данного запрещенного IP-адреса? – John

+0

Синтаксис выглядит как 'bannedips [0] [: ip]'. [Прочитайте документацию.] (Http://www.ruby-doc.org/core-2.1.5/Hash.html) – Adrian

ответ

2

Если есть разумное количество IP-адресов, которые необходимо отслеживать, я бы, вероятно, использовать простой Hash:

banned_ips = { 
    "10.10.10.10" => {:timestamp => Time.now, :reason => 'foo'}, 
    "20.20.20.20" => {:timestamp => Time.now, :reason => 'bar'}, 
    "30.30.30.30" => {:timestamp => Time.now, :reason => nil} 
} 

Хэш представляет собой быстрый и грязный способ создать список, который действует как индексированная база данных; Поиск очень быстрый. И, так как вы можете иметь только один экземпляр конкретного ключа, он держит вас от контакта с повторяющимися данными:

banned_ips["20.20.20.20"] # => {:timestamp=>2015-01-02 12:33:19 -0700, :reason=>"bar"} 
banned_ips.keys # => ["10.10.10.10", "20.20.20.20", "30.30.30.30"] 

В качестве общего кончике программирования для выбора массивов против хэшей. Если вы:

  • необходимо быстро получить доступ к определенному значению, использовать хэш, который действует как база данных с произвольным доступом.
  • хотите иметь очередь или список значений, которые вы будете последовательно получать, а затем использовать массив.

Итак, для чего вы хотите получить значения, привязанные к определенному IP, используйте хэш. Массив или массив массивов заставят код тратить время на поиск определенного значения и замедлятся по мере добавления новых элементов в массив из-за этих поисков.

Существует точка, в которой становится более разумным хранить эту информацию в базе данных, и, как разработчик, хорошо узнать о них. Они - один из многих инструментов, которые нам нужны в нашей панели инструментов.

+0

Спасибо за ответ. Я собираюсь с этим, так как это всегда будет небольшой массив. Поэтому я могу использовать 'banned_ips.include? ip', чтобы проверить, запрещен ли IP-адрес, но что я могу использовать, чтобы получить дополнительные данные? – John

+1

@John, оловянный человек уже ответил на ваш вопрос. 'banned_ips [" 20.20.20.20 "]' дает вам хэш деталей. Чтобы получить конкретное значение из этого хэша, просто извлеките его с помощью его ключа, например: 'banned_ips [" 20.20.20.20 "] [: reason]' –

3

В Ruby, многомерные массивы просто массивы массивов:

bannedips = [["10.10.10.10", "more data", "etc"], ["20.20.20.20", ...]] 

Лучше было бы использовать массив хэш, так что вы можете маркировать значение:

bannedips = [{ip: "10.10.10.10", timestamp: 89327414}, ...] 
2

Да, многомерного в Ruby возможны массивы. Массивы могут содержать любое значение, так многомерный массив только массив, содержащий другие массивы:

banned_ips = [ 
    ["10.10.10.10", Date.new(2015, 1, 2), "reason"], 
    ["20.20.20.20", Date.new(2014, 12, 28), "reason"], 
    ["30.30.30.30", Date.new(2014, 12, 29), "reason"], 
] 

Лично хотя я бы не рекомендовал использовать многомерный массив для этой цели. Вместо этого создайте класс, который инкапсулирует информацию о запрещенном IP-адресе.

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

class BannedIP 
    attr_reader :ip, :time, :reason 

    def initialize(ip, time:, reason: "N/A") 
    @ip = ip 
    @time = time 
    @reason = reason 
    end 
end 

banned_ips = [ 
    BannedIP.new("10.10.10.10", time: Date.new(2015, 1, 2)), 
    BannedIP.new("20.20.20.20", time: Date.new(2014, 12, 28)), 
    BannedIP.new("30.30.30.30", time: Date.new(2014, 12, 29), reason: "Spam"), 
]  
Смежные вопросы