if / else语句通过hash(Ruby)

时间:2016-08-09 15:17:00

标签: ruby if-statement hash

我为联系人列表创建了一个哈希(对于这个概念仍然相对较新),其中键是名称,值是电话号码(两个字符串)。要求用户采取行动;您可以在此处搜索用户的全名:

print "Search Name: "
name_search = gets.chomp

contact_book.each { |name, number| puts "The name entered corresponds to the following phone number: #{number}\n" if name.upcase == name_search.upcase }

我想放一个else语句,当循环遍历哈希时输入与任何键不匹配时会通知用户,但是无法找到方法。

3 个答案:

答案 0 :(得分:2)

您可以使用Enumerable#select并管理返回的数组

matched_names = contact_book.select { |name, number| name.upcase == name_search.upcase }
if matched_names.any?
   puts "The name entered corresponds to the following phone number: #{matched_names.first.last}\n"
else
   puts "The name entered has no matches\"
end 

请注意,这突出表明您可能有多个具有相同名称的条目。

答案 1 :(得分:1)

在哈希中你可以像这样查找一个键:

# convert all keys to upcase
contact_book_lookup = {}
hash.each_with_object(contact_book_lookup){ |(k, v), tmp_h| tmp_h[k.upcase] = v }

search_key = name_search.upcase
if contact_book_lookup.has_key? search_key 
  puts "The name entered corresponds to the following phone number:   #{contact_book_lookup[search_key]}\n"
else
  puts "The name entered has no matches\" 
end

答案 2 :(得分:0)

其他答案看起来会起作用,但对于你想要完成的事情似乎相当冗长。我想这只是风格偏好,但是为了效率:如果我想看看散列是否有一个键,我会在一行中这样做。

phone_num = contact_book[ name_key ]
puts ( phone_num ) ? "#{name_key}'s phone number is #{phone_num}" : "#{name_key} not found"

我注意到有人试图每次都重写一切。为了提高效率,通常在存储名称时执行此操作一次,而不是在搜索名称时执行NxM次。