在程序启动时加载或写入设置

时间:2018-11-06 07:55:23

标签: ruby

数据是通过以下方式生成的:

def checkConfigurationsFile
    if File.exist?("./prefs/settings.conf") == true
      configFile = File.read("./prefs/settings.conf")
      options = JSON.parse(configFile)
      configData = {:multithreading => options['multithreading'],
                    :systemCores => options['systemCores']}
      mainmenu()

      elsif File.exist?("./prefs/settings.conf") == false
        configData = {:multithreading => false,
                      :systemCores => 1}

        configFile = File.open("./prefs/settings.conf","w")
        configFile.write(JSON.pretty_generate(configData))
        configFile.close
        checkConfigurationsFile()
      else
        puts "Something went terribly wrong!"
    end
end

这是一个设置菜单:

    def openPreferences
    puts <<-PREFERENCES
        ####################################################
        #|                                                |#
        #|  Preferences                                   |#
        #|  ------------------                            |#
        #|   1. Using Multithreading? (Currently #{configData[multithreading]})                                             |#
        #|  2. Adjust Multithreading (Currently #{configData[systemCores]} are used)|#
        #|                                                |#
        ####################################################
    PREFERENCES
      print "Enter a number to change settings: "
      choice = gets.i 

      if blablabla
      ...

如果用户决定更改其配置,则需要能够执行此操作。但是似乎我无法使用在checkConfigurationsFile方法中生成的数据,因为它们是私有的(并且通过程序各处的参数传递它们毫无意义)。

它产生此错误消息:

Traceback (most recent call last):
        3: from dbaser.rb:214:in `<main>'
        2: from dbaser.rb:10:in `checkConfigurationsFile'
        1: from dbaser.rb:54:in `mainmenu'
dbaser.rb:205:in `openPreferences': undefined local variable or method `configData' for main:Object (NameError)

1 个答案:

答案 0 :(得分:0)

如果您不想在任何地方传递配置,则需要使其全局。有几种方法可以做到这一点。

例如,只需将所有configData替换为$configData。繁荣,完成了。但这可能会让人皱眉。

或者,更“专业”的方法是使用某种全局单例配置对象。

类似这样的东西:

class ConfigData
  class << self
    attr_accessor :multi_threading, :system_cores
  end
end

然后

# write at startup
ConfigData.system_cores = options['systemCores']

# read in another place
ConfigData.system_cores