Изучение хэшей в Ruby

#ruby #hash

#ruby #хэширование

Вопрос:

Я пытаюсь выяснить, как напечатать только ключ в хэше прямо сейчас. Я все еще новичок в этом, и мне чего-то не хватает в том, как просто распечатать ключ. Мой код до сих пор:

 shopping_list = {
    'milk' => false,
    'eggs' => false,
    'jalapenos' => true
}

puts "Here is your shopping list!"
shopping_list.each do |key|
    puts "- #{key}"
end
  

Мой вывод:

 Here is your shopping list!
- ["milk", false]
- ["eggs", false]
- ["jalapenos", true]
  

Я просто хочу, чтобы значение для печати выглядело как:

 Here is your shopping list!
- milk
- eggs
  

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

Ответ №1:

Вы можете получить нужные значения, комбинируя #reject , #keys и #each методы, подобные приведенным ниже:

 shopping_list.reject { |key, value| value }.keys.each do |key|
  puts "- #{key}"
end

  

Как упоминал Кэри Свовленд, приведенный выше код создавал временные массивы. Если вы не хотите создавать их, вы можете использовать приведенный ниже код:

 shopping_list.each do |key, value|
  puts "- #{key}" if value == false
end

  

Комментарии:

1. @CarySwoveland это можно улучшить, shopping_list.each { |k,v| puts "- #{k}" unless v } было бы лучше.

Ответ №2:

Понял это.

 shopping_list = {
    'milk' => false,
    'eggs' => false,
    'jalapenos' => true
}

puts "Here is your shopping list!"
for key in shopping_list.keys()
    puts "- #{key}"
end
  

Мой вывод.

 Here is your shopping list!
- milk
- eggs
- jalapenos
  

Комментарии:

1. Это не возвращает результат, указанный вами в вопросе.

2. Я знаю, это был шаг на моем пути к пониманию этого. На самом деле это одна из других вещей, которые мне нужно было сделать в конце.