使用.nil的意外布尔结果?在哈希

时间:2013-05-10 21:14:54

标签: ruby boolean null

我正在通过关于codecademy的练习,我遇到了一个我不完全理解的解决方案.nil?这是我的代码:

movies = { GIS: 10.0, Phantasm: 1.5, Bourne: 4.0}
puts "Whats your movie brah?"
title = gets.chomp
puts "What's your rating brah?"
rating = gets.chomp
movies[title.to_sym] = rating.to_i
puts "Your info was saved brah!"
case movies
when 'add'
  puts "What movie do you want to add son?"
  title = gets.chomp
  if movies[title.to_sym].nil?
    puts "What's your new rating brah?"
    rating = gets.chomp
    movies[title.to_sym] = rating.to_i
    puts "#{title} has been added with a rating of #{rating}."
  else
    puts "That movie already exists! Its rating is #{movies[title.to_sym]}."
  end
when "update"
 if movies[title.to_sym].nil?

when "display"
puts "Movies!"
when "delete"
puts "Deleted!"
else puts "Error!"
end

我只是指add方法。脚本的其余部分是正在进行的工作。我不喜欢不理解事情,这让我有点夸张。

我的问题是Ruby是否知道不添加已存在的标题,因为两个符号不能具有相同的名称?我很好奇它如何确定散列何时没有值。谁能为我澄清一下这个?我真的很感激!

1 个答案:

答案 0 :(得分:0)

答案有点复杂。

来自RubyDoc:“当两个对象的hash值相同且两个对象相互为eql?时,两个对象引用相同的哈希键。”

对象的hash值是基于对象包含的数据的计算数值结果。并且eql?方法测试两个对象是否相等,并且这通常在ruby中别名为==(即my_string1 == my_string2与my_string1.eql?my_string2相同)。

当你说movies[title.to_sym]时,Ruby会说“在电影哈希中,是否有任何对存储在key.eql? title.to_sym and key.hash == title.to_sym.hash的位置?如果是,则返回配对的值,如果不返回{ {1}}。

如果已经存在,则Ruby不添加标题的原因是因为您的nil行,在英语中转换为“仅在不存在键if movies[title.to_sym].nil?的配对时才执行以下操作。 “

如果您有title.to_sym,而您只是说title = "GIS",Ruby很乐意过度编写您当前存储的movies[title.to_sym] = 1,以便10.0返回{{} 1}}。