Статьи

Совет: много способов создать хэш в Ruby

Как 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. Я надеюсь, что вы узнали что-то о создании Хэшей и / или моих детей. Кстати, о детях нет, поэтому я собираюсь пойти в паб за скобками. Добрый день!