如何检查Ruby哈希(Hash)中是否已存在特定值?
检查Ruby哈希中是否存在特定值的方法及代码修正
一、正确检查哈希值存在的方法
Ruby哈希提供了专门的方法来检查值是否存在,常见的有两种:
Hash#value?(target_value):这是哈希类自带的方法,直接检查哈希的所有值中是否包含目标值,返回true或false。示例:words = { Time.now => "apple", Time.now => "banana" } puts words.value?("apple") # 输出 true puts words.value?("orange") # 输出 falseHash#values.include?(target_value):先通过values方法把哈希的所有值转换成数组,再用数组的include?方法检查。效果和value?一致,示例:words = { Time.now => "apple", Time.now => "banana" } puts words.values.include?("banana") # 输出 true
二、你的代码逻辑问题分析
你当前代码里的words.include?(wordsvariable)是错误的,因为Ruby哈希的include?方法默认检查的是键(key)是否存在,而不是值(value)。你的哈希words的键是Time.now生成的时间对象,值是用户输入的单词字符串,所以wordsvariable(字符串)永远不会和哈希的键(时间对象)相等,这会导致你的判断逻辑完全失效——永远不会触发"This word is already learned..."的提示。
另外,你的代码里action变量没有定义,会直接报错,应该先获取用户的操作选择(比如输入1表示添加单词)。
三、修正后的代码示例
words = {} puts "Which word do you want to teach the Baby?" wordsvariable = gets.chomp # 补充获取用户操作的逻辑 puts "Enter action (1 for add word):" action = gets.chomp if action == "1" && words.value?(wordsvariable) puts "This word is already learned by the Baby, try again." elsif action == "1" && !words.value?(wordsvariable) words[Time.now] = wordsvariable puts "Congrats you have taught the word: #{wordsvariable} to Baby." end
补充小建议
如果你的需求是避免重复添加相同的单词,用value?是最直接高效的方式;另外,用Time.now作为键可能会有问题——短时间内添加多个单词时,Time.now可能生成相同的时间(精度限制),导致后面的单词覆盖前面的。如果要避免这个,可以考虑用单词本身作为键,比如:
words = {} # 添加时判断键是否存在(即单词是否已添加) if words.key?(wordsvariable) puts "Already learned!" else words[wordsvariable] = Time.now puts "Taught successfully!" end
内容的提问来源于stack exchange,提问作者Dion12345
相关产品推荐
相关产品推荐

