我在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
答案 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
的块形式可确保文件在块结束时关闭。