ruby:如何在本地上下文中加载.rb文件

dis*_*ted 15 ruby variables load scope local

如何在Ruby中完成这个简单的任务?
我有一些简单的配置文件

=== config.rb
config = { 'var' => 'val' }
Run Code Online (Sandbox Code Playgroud)

我想从文件中定义的某个方法加载配置文件,main.rb以便局部变量config.rb成为该方法的本地变量.
像这样的东西:

=== main.rb
Class App
    def loader
        load('config.rb') # or smth like that
        p config['var']   # => "val"
    end
end
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用全局变量config.rb,然后在完成后取消定义它们,但我希望有一种红宝石方式)

Dar*_*win 12

配置文件.

{ 'var' => 'val' }
Run Code Online (Sandbox Code Playgroud)

加载配置文件

class App
  def loader
    config = eval(File.open(File.expand_path('~/config.rb')).read)
    p config['var']
  end
end
Run Code Online (Sandbox Code Playgroud)


ako*_*nov 7

正如其他人所说,对于配置,最好使用YAML或JSON.评估文件

binding.eval(File.open(File.expand_path('~/config.rb')).read, "config.rb") binding.eval(File.read(File.expand_path('~/config.rb')), "config.rb")

此语法允许您在回溯中查看重要的文件名.参见api docs [1].

更新了eval命令以避免FD(文件描述符)泄漏.我一定是在睡觉,或者应该在晚上的那个时候睡觉,而不是在stackoverflow上写.

[1] http://www.ruby-doc.org/core-1.9.3/Binding.html


NZK*_*Koz 5

你肯定可以使用eval和File.read来解决一个解决方案,但事实上这很难,应该会给你一个信号,告诉你这不是类似ruby的方法来解决你遇到的问题.两种替代设计将使用yaml作为配置api,或定义一个简单的dsl.

YAML案例是最简单的,你在main.rb中只需要这样的东西:

Class App
  def loader
      config = YAML.load('config.yml')
      p config['var']   # => "val"
  end
end
Run Code Online (Sandbox Code Playgroud)

你的配置文件看起来像:

--- 
var: val
Run Code Online (Sandbox Code Playgroud)

  • "PHP可以做到这一点" ......尽量不尖叫......还有在互联网上的网站不计其数的是证明PHP可以做到这一点,这使我们的休息诅咒谁允许它的程序员. (2认同)