【问题标题】:Accessing Hash Keys with user inputted variables,Nil value No method error NoMethodError使用用户输入的变量访问哈希键,Nil 值没有方法错误 NoMethodError
【发布时间】:2015-12-26 14:02:24
【问题描述】:

您好,我创建了一个由 JSON 文件组成的小型 ruby​​ 项目。我将 JSON 数据存储到哈希键中。并编写了一种方法来使用用户输入访问哈希键中存在的数据。但是当我尝试发送使用用户输入时,我收到了这个错误

how_many_ingredients': undefined methodkeys' for nil: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

访问how_Many_ingredients方法的文件2,我可以看到变量被传递给了那个方法

require './1'
class Hello < Methods


 person = Methods.new

person.test
puts "enter recipie"
person.name
str = gets
person.how_many_ingredients str
end

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您的代码假定在hash['recipes'][text] 处始终存储有一个哈希值 - 您需要满足它不存在的情况。

    执行此操作的一种简单方法是使用&amp;&amp; 符号向下遍历哈希 - 如果任何步骤为 nil(或 false),则该行将返回 nil(或 false)而不是爆炸。例如

    puts hash['recipes'] && hash['recipes'][text].is_a?(Hash) && hash['recipes'][text].keys
    

    请注意,在调用 .keys 之前,我正在测试 hash['recipes'][text] 是一个哈希值(而不仅仅是一个字符串)。

    【讨论】:

      【解决方案2】:

      请注意,当您使用gets 时,输入可以包含换行符和回车符。您需要使用gets.chomp 来过滤这些内容。这可能是您的程序出现问题的原因。

      比较以下两个:

      > puts gets.size
      "Hello!"
      # 7
      
      > puts gets.chomp.size
      "Hello!"
      # 6
      

      请注意,您仍然需要扩展您的程序以考虑用户输入的不在您的散列中的键。

      【讨论】:

      • 太棒了! Drenmi,非常感谢....对 ruby​​ 有点陌生,现在我试图了解发生了什么
      猜你喜欢
      • 1970-01-01
      • 2016-01-20
      • 2014-04-16
      • 2017-03-01
      • 2013-03-22
      • 2013-04-18
      • 2014-10-21
      • 2013-12-06
      • 1970-01-01
      相关资源
      最近更新 更多