Ruby:在YAML.load的hash上获得Stack级别太深

时间:2013-09-01 14:37:03

标签: ruby stack yaml

我在ruby(1.9.3)中使用YAML来转储和加载应用程序使用的选项。

文件的路径存储在constants.rb文件中的常量中,该文件由应用程序的主可执行文件加载。这些选项作为Options类加载,它直接继承自hash(类Options< Hash)。

当我尝试加载保存在选项文件中的YAML时,我得到一个SystemStackError:堆栈太深(来自workspace.rb:80的irb或来自命令行的to_ruby.rb:306)。

我将为下面的课程编写代码。很高兴有任何意见。感谢

class Options < Hash
  attr_reader :path, :default_content

  def initialize
    @path = LOG_DIR + '/options.yml'
    @default_content = { auto: true, cbz: true, is_set_up: false }

    if File.exists?( @path )
      self.merge!( YAML.load( File.read( @path ) ) )
    else
      load_default
    end
  end

  def update( key, value )
    if self.has_key?( key )
      self[key] = value
      File.open( @path, 'w' ).write( YAML.dump( self ) )
    else
      puts 'That key does not exist'
    end
  end

  def load_default
    # load default options
    self.merge!( @default_content )
  end
end

Options.new

这是试图加载的yaml:

--- !ruby/hash:Options
:auto: true
:cbz: true
:is_set_up: true

1 个答案:

答案 0 :(得分:0)

删除它:

--- !ruby/hash:Options

离开这个:

:auto: true
:cbz: true
:is_set_up: true

该行是Options类的序列化实例,并且让Options类在其初始化程序中加载自身的实例是堆栈爆炸的处方。

这应该可以解决问题:

def update( key, value )
  if self.has_key?( key )
    self[key] = value
    File.open( @path, 'w' ) do |f|
      f.write( to_h.to_yaml )
    end
  else
    puts 'That key does not exist'
  end
end

to_h.to_yaml将散列写为YAML。此外,使用File.open的块形式可确保文件在块结束时关闭。