我正在通过关于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是否知道不添加已存在的标题,因为两个符号不能具有相同的名称?我很好奇它如何确定散列何时没有值。谁能为我澄清一下这个?我真的很感激!
答案 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}}。