我创建了一个用于存储配置数据的类。目前该课程如下:
class Configed
@@username = "test@gmail.com"
@@password = "password"
@@startpage = "http://www.example.com/login"
@@nextpage = "http://www.example.com/product"
@@loginfield = "username"
@@passwordfield = "password"
@@parser = "button"
@@testpage = "http://www.example.com/product/1"
@@button1 = "button1"
def self.username
@@username
end
def self.password
@@password
end
def self.startpage
@@startpage
end
def self.nextpage
@@nextpage
end
def self.loginfield
@@loginfield
end
def self.passwordfield
@@passwordfield
end
def self.parser
@@parser
end
def self.testpage
@@testpage
end
def self.button1
@@button1
end
end
要访问我正在使用的变量:
# Config file
require_relative 'Configed'
# Parse config
startpage = Configed.startpage
loginfield = Configed.loginfield
passwordfield = Configed.passwordfield
username = Configed.username
password = Configed.password
nextpage = Configed.nextpage
parser = Configed.parser
testpage = Configed.testpage
这不是很模块化。需要在三个位置引用添加其他配置数据。
有更好的方法来实现这一目标吗?
答案 0 :(得分:4)
您可以制作班级实例变量......
class Configed
@username = "test@gmail.com"
@password = "password"
@startpage = "http://www.example.com/login"
# ...
class << self
attr_reader :username, :password, :startpage # ...
end
end
它更紧凑,仍然给你
username = Configed.username
# ...
注意:@philomory的答案中有很多好主意值得考虑。特别是使用YAML可以为不同的环境test
,development
,production
等设置不同的常量,并且可以将当前环境的配置选项加载到创建的OpenStruct中。初始化器。提供更灵活的解决方案。
答案 1 :(得分:3)
有很多潜在的改进。首先,如果你不想要他们的weird specific inheritance-related behavior,没有理由使用类变量,如果你不打算实例化它,就没有理由使用类。
您可以使用模块:
module Configed
module_function
def username
'username'
end
# etc
end
Configed.username
但坦率地说,使用哈希几乎肯定会更好:
Config = {
username: 'username'
# etc
}.freeze
Config[:username]
或者,如果您更喜欢方法式访问,请OpenStruct:
require 'openstruct' # from standard library
Config = OpenStruct.new(
username: 'username'
# etc
).freeze
Config.username
如果需要修改,请不要freeze
。此外,通常不是类或模块(例如散列)的常量在ALL_CAPS中将具有名称,例如, CONFIGED
,但是,这是一种风格决定,对代码没有实际影响。
你的问题是指'解析'配置,当然,你不是;您的设置中的配置数据(以及到目前为止的示例中)只是Ruby代码。如果您宁愿从非代码文件加载它,那么总是YAML:
config.yaml:
username: username
password: password
config.rb:
require 'yaml' # from Standard Library
Configed = YAML.load_file('config.yaml')
Configed['username']
或JSON:
config.json:
{
"username": "username",
"password": "password"
}
config.rb:
require 'json' # from Standard Library
Configed = JSON.parse(File.read('config.json'))
Configed['username']