Ruby:如何从另一个文件导入变量?

时间:2011-12-20 10:45:31

标签: ruby

我正在尝试创建一个用于指南针的本地配置文件,以便我们可以在开发人员的计算机上处​​理不同的导入路径。到目前为止,我已经尝试在异常块中导入文件,如果它不存在,那么进一步使用该变量:

local_config.rb

VENV_FOLDER = 'venv'

config.rb

VENV_FOLDER = '.'
begin
  require 'local_config.rb'
rescue LoadError
end
puts VENV_FOLDER

通常我是Python开发人员,所以我希望导入会将VENV_FOLDER的值更改为venv,但之后它仍为.

有没有办法导入local_config.rb,使其覆盖VENV_FOLDER的值?

3 个答案:

答案 0 :(得分:12)

其他替代方案:

YAML(或JSON)

<强> local_config.yml

venv_folder: 'venv'

<强> config.rb

require 'yaml'

VENV_FOLDER = begin
  YAML.load_file('local_config.yml').fetch('venv_folder')
rescue Errno::ENOENT, KeyError
  '.'
end

puts VENV_FOLDER

类实例变量

您可以将值放在类实例变量中:

<强> local_config.rb

Config.venv = 'venv'

<强> config.rb

class Config
  class << self ; attr_accessor :venv ; end
  self.venv = '.'
end

begin
  require './local_config.rb'
rescue LoadError
end

puts Config.venv

常量

另外,坚持使用常量的ruby文件,以下内容的意图可能略微清楚,并避免必须捕获异常。

<强> local_config.rb

VENV_FOLDER = 'venv'

<强> config.rb

config_file = './local_config.rb'
require config_file if File.file? config_file
VENV_FOLDER ||= '.'

puts VENV_FOLDER

所有三种解决方案都有不同的机制来确保即使文件丢失或未按预期设置值也将设置该值。希望它有用

答案 1 :(得分:1)

文件的路径错误。如果未从$ LOAD_PATH加载斜杠,则需要包含斜杠。

你的LoadError正在静静地抓住。

如果你这样做:

VENV_FOLDER = '.'

begin
  require './local_config.rb'
rescue LoadError
end

puts VENV_FOLDER

然后你会发现它有效。

更好的是:

VENV_FOLDER = '.'

require File.expand_path('../local_config.rb', __FILE__) rescue LoadError

puts VENV_FOLDER

由于第二个版本不依赖于调用脚本的用户的PWD。

然而,不断重新分配是一个坏主意。 Ruby会让你这样做,但你会收到警告。我相信你的困惑只是与LoadError有关。

答案 2 :(得分:0)

尝试这样的事情:

<强> local_config.rb

VENV[:folder] = 'venv'

<强> config.rb

VENV = {:folder => '.'}
begin
    load 'local_config.rb'
rescue Exception
end

puts VENV[:folder]

这是ruby 1.9.3的工作版本:https://gist.github.com/1501237

对于ruby 1.8.7:https://gist.github.com/1501321