您好我创建了一个由JSON文件组成的小型ruby项目。我将JSON数据存储到哈希键中。并且使用用户输入来访问存在于散列键中的数据的方法。但是,当我尝试发送使用用户输入时,我收到此错误
nil的 how_many_ingredients': undefined method
个键:NilClass(NoMethodError)
我发现此链接有相同的问题,并尝试了该解决方案,但我仍然得到相同的错误 Accessing Hash Keys with user inputted variables, NoMethodError
编写所有方法的文件
require 'json'
class Methods
attr_accessor :name, :text
def initilize(name)
@name = name
@text = text
end
def how_many_ingredients(text)
puts 'text'
file = File.read('a.json')
hash = JSON.parse(file)
#puts hash['recipes']['pizza'].keys
puts hash['recipes'][text].keys
end
end
文件2访问how_Many_ingredients方法,我可以看到变量传递给该方法
require './1'
class Hello < Methods
person = Methods.new
person.test
puts "enter recipie"
person.name
str = gets
person.how_many_ingredients str
end
答案 0 :(得分:2)
请注意,使用gets
时,输入可以包含换行符和回车符。您需要使用gets.chomp
来过滤这些内容。这可能是您程序中问题的原因。
比较以下两个:
> puts gets.size
"Hello!"
# 7
> puts gets.chomp.size
"Hello!"
# 6
请注意,您仍然需要将程序扩展到用户输入的密钥中,而这些密钥不在您的哈希值中。
答案 1 :(得分:0)
您的代码假定hash['recipes'][text]
处始终存在哈希值 - 您需要满足不存在的情况。
执行此操作的一种简单方法是使用&&
符号向下遍历哈希 - 如果任何步骤为nil(或false),则该行将返回nil(或false)而不是爆炸。例如
puts hash['recipes'] && hash['recipes'][text].is_a?(Hash) && hash['recipes'][text].keys
注意我在调用hash['recipes'][text]
之前测试.keys
是一个哈希(而不仅仅是一个字符串)。