0

我正在做关于 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 是否知道不添加已经存在的标题,因为两个符号不能具有相同的名称?我很好奇它如何确定哈希何时没有价值。任何人都可以为我澄清这一点吗?我真的很感激!

4

1 回答 1

0

答案比这要复杂一些。

来自RubyDochash :“当两个对象的值相同并且两个对象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?如果是,则返回该配对值,如果没有则返回nil

如果它已经存在,Ruby 不添加标题的原因是因为您的if movies[title.to_sym].nil?行,在英语中翻译为“仅在不title.to_sym存在密钥配对时执行以下操作”。

如果你有title = "GIS",并且你只是说movies[title.to_sym] = 1,Ruby 很乐意覆盖10.0你当前存储在那里的内容,以便movies[:GIS]返回1

于 2013-05-10T21:51:57.550 回答