Ruby Access类变量很容易

时间:2016-11-04 01:05:15

标签: ruby class

我创建了一个用于存储配置数据的类。目前该课程如下:

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

这不是很模块化。需要在三个位置引用添加其他配置数据。

有更好的方法来实现这一目标吗?

2 个答案:

答案 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可以为不同的环境testdevelopmentproduction等设置不同的常量,并且可以将当前环境的配置选项加载到创建的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']