Как Rubyists, мы используем Хеши для всего. Они просто так легки и полезны. Я имею в виду, как часто вам нужно что-то связанное с чем-то другим? Много, если ты похож на меня. Например, у меня четверо (4) детей, что очень много. Мне нравится носить с собой такой хэш, чтобы я не забывал их имена:
$> kids = {1: "Logan", 2: "Emma", 3: "Lily", 4: "Becca"}
Ну, вот как я начал, но это немного больше, чем прославленный массив. Кроме того, мне понадобилась вся информация о них, поэтому я изменил хеш:
$> kids = {logan: { gender: :boy, dob: Date.new(2000, 12,24), sports: [:soccer], favorite: false } ... }
Вы поняли идею. Этот хэш хорошо послужил мне в течение достаточно долгого времени, но я подумал, что смогу найти несколько разных способов создания этого хеша, чтобы посмотреть, смогу ли я сделать его еще более полезным.
Это хэш-создание ваших бабушек и дедушек
Хорошо, давайте выберем нормальные, скучные способы создания хэша. Во-первых, то, что я сделал выше, это синтаксис для создания хэша:
$> kids = {logan: { gender: :boy, dob: Date.new(2000, 12,24), sports: [:soccer], favorite: false } ... }
Хотя это не сексуально и не увлекательно, тем не менее 99,99999% хешей создаются в Ruby. Это похоже на JSON. На самом деле, я часто задаюсь вопросом, все ли объекты Hashes и JSON тусуются вместе в некоторых местах, называемых Value Bar (это в Keys, понятно?) И смешиваются. Но я отвлекся.
Другой способ создания хэша, вызывающий зевок, заключается в вызове метода .new
:
$> kids = Hash.new => {}
Это дает нам пустой хэш. Вы ожидали, что я это сделаю?
$> hash = Hash.new(logan: {...})
Если бы вы были, ВАУ, вас ждет сюрприз! Hash.new
не так скучно, как вы думаете.
Все new
снова весело
Hash.new
добавляет к созданию Hash.new
немного pizazz, nay flare, nay je ne sais quoi . В приведенном выше примере мы все еще получаем пустой хэш:
$> kids = Hash.new(logan: {...}) => {}
Но теперь мы получаем новую функцию в виде значения по умолчанию . Это означает, что если вы попросите Hash указать значение ключа, которого нет в Hash, вы получите то, что передали .new
. Вот как я улучшил хэш своих kids
с помощью этой функции:
$> kids = Hash.new({yours: false, send_them_home: true}) => {} $> kids[:colin] => {:yours=>false, :send_them_home=>true}
Итак, теперь, когда Джилл ( { wife: true, birthday: [elided], right: true
})) называет имя ребенка, и этот ребенок не мой, я получаю некоторую достоверную информацию и инструкции о том, что делать. Сладкий! Кстати, вы можете увидеть объект хеша по умолчанию, вызвав #default
:
$> kids.default => {:yours=>false, :send_them_home=>true}
ИЛИ, вы можете переопределить значение по умолчанию для хеша, вызвав hash.default = <the object>
:
$> kids.default = {yours: false, embarrass: false } => {:yours=>false, :embarrass=>false}
Но ждать! Есть еще кое-что! Вы также можете передать блок в .new
который будет запускаться каждый раз, когда вы запрашиваете ключ, которого нет в Hash:
$> kids = Hash.new do |hash, key| $> puts "This is not your kid!" $> puts "Don't curse in front of them!" $> hash[key] = {yours: false, send_them_home: true} $> end => {} $> kids[:taylor] This is not your kid! Don't cuss in front of them! => {:yours=>false, :send_them_home=>true}
Отлично. Опять же, я задействовал некоторые из менее известных функций инициализации хэша, чтобы предоставить мне отличную информацию. Кстати, обратите внимание, что когда я передаю блок, мне также необходимо вручную хранить ключ и значение в хэше. Если я этого не сделаю, блок будет запускаться каждый раз, когда я получаю доступ к тому же отсутствующему ключу. Кроме того, так же, как вы можете переопределить объект по default
для Hash, вы можете переопределить default_proc
:
$> kids.default_proc => #<Proc:0x007fc1eb2d7f80@(irb):15> $> kids.default_proc = -> (hash, key) { puts "Find an adult" }
Держите создание хэша странным
Для полноты картины я упомяну несколько других способов создания хэша. Я на 100% уверен, что они абсолютно бесполезны, и никто никогда не использовал их в истории программирования на Ruby.
Странный метод хеш-скобок № 1:
$> other_peoples_kids = Hash[ "colin", {friend_of: :logan, nerdy: true}, "taylor", {friend_of: :lily, annoying: true}] => {"colin"=>{:friend_of=>:logan, :nerdy=>true}, "taylor"=>{:friend_of=>:lily, :annoying=>true}}
Итак, вы передаете массив с четным числом элементов, и этот чудовищный Hash
разбивает их на пары ключ-значение.
Странный метод хеш-скобок № 2:
$> kids_interests = Hash[[[:logan, [:soccer, :pokemon]], [:emma, [:cheer, :not_mowing_the_lawn]]]] => {:logan=>[:soccer, :pokemon], :emma=>[:cheer, :not_mowing_the_lawn]}
Здесь передача массива из двухэлементных массивов преобразуется в хэш. Серьезно, кто это придумал?
Странный метод хеш-скобок № 3:
$> kids_favorite_foods = Hash["login"=>"wings", "emma"=>"pizza", "lily"=>"airheads", "becca"=>"unknown"] => {"login"=>"wings", "emma"=>"pizza", "lily"=>"airheads", "becca"=>"unknown"}
Очевидно, что если я передаю Hash Hash[]
я получаю Hash. Это хэш-эквивалент еды кукурузы.
Эти методы брекетинга настолько странны, что я представляю себе плохие хэши, висящие на «брекетинге» панели значений, чтобы получить максимум. Или что-то.
Друзья не пускают друзей в скобки и код
Ну, вот и все для сегодняшнего Quick Tip. Я надеюсь, что вы узнали что-то о создании Хэшей и / или моих детей. Кстати, о детях нет, поэтому я собираюсь пойти в паб за скобками. Добрый день!