Ruby:解析conf文件并将值存储到Hash和打印哈希元素中

时间:2016-05-30 06:51:52

标签: ruby

我的代码:

class Dictionary
  def initialize
    hash = {}
  end
  key_value = "settings.conf"
  def add(key_value)
    key_value.each do |key, value|
      hash[key] = value
    end
  end
  for key in hash.keys()
    print key, "/", hash[key], "\n"
  end
end

我收到以下错误:

  

1.rb:11:在<class:Dictionary>': undefined method键中为665341102:Fixnum(NoMethodError)来自1.rb:1:在''

知道这里的错误是什么吗?

3 个答案:

答案 0 :(得分:0)

您可能希望将hash初始化为实例变量,即@hash,以便在同一类的其他方法中使用它。

目前在hash方法下定义的initialize是常规方法,因此其范围仅限于该方法。当您尝试在方法add下访问它时,上面的初始化超出了此范围,因此它在主对象上调用Object#hash方法,这是一个fixnum:

def initialize
   @hash = {}
end

 def add(key_value)
    key_value.each do |key, value|
      @hash[key] = value
    end
  end

答案 1 :(得分:0)

正如其他人所建议的那样,不要使用hash作为变量,因为事实证明它是属于Object类的主对象的方法,作为返回Fixnum。我想建议一些更改,以使其工作: -

  1. 使用实例变量,以便所有类的方法都可以访问它
  2. 移动逻辑以将哈希的内容显示为方法
  3. 没有给出文件的路径,只有名称
  4. 读取文件的内容(File.read或其他东西)并进行某种解析以获取所需的键,值格式的数据以将其存储在散列中
  5. 以下是上面列出的一些更改的示例 -

    class Dictionary
      def initialize
        @temp = {}
        # it assigns just the file name not the absolute/relative path to the file
        @key_value = "settings.conf"
      end
      def add(key_value)
        # modify this method to read data from the file
        @key_value.each do |key, value|
         @temp[key] = value
        end
      end
      def display_temp
        for key in @temp.keys
          print key, "/", @temp[key], "\n"
        end
      end
    end
    

答案 2 :(得分:0)

这个怎么样:

配置:

$ cat config.yml
key1: value1
key2: value2

代码:

$ cat ruby_example.rb
require 'yaml'

class Config

  attr_reader :val1, :val2

  private

  def initialize(file)
    config_from_file = YAML.load_file(file)
    @val1 = config_from_file['key1']
    @val2 = config_from_file['key2']
  end
end

conf = Config.new('config.yml')

puts conf.val1
puts conf.val2