如何在我的.rb文件中共享变量?

时间:2011-11-30 23:43:51

标签: ruby include

我有几个.rb个文件,我想在所有文件中使用相同的变量。假设应该可以从我的所有test_variable = "test"文件中访问变量.rb。我怎样才能做到这一点?

我使用settings.rb创建了test_variable = "test"文件,然后在另一个require 'settings'文件中使用了.rb,但它无效。我想使用require而不是load

我尝试通过在变量名前加$前缀来使变量成为全局变量,但我仍然得到undefined local variable or method 'test_variable' for main:Object (NameError)

4 个答案:

答案 0 :(得分:44)

  1. 将常量(包括模块和类)添加到共享全局环境中:

    phrogz$ cat constants1.rb 
    TEST_VARIABLE = "test"
    
    phrogz$ cat constants2.rb 
    require_relative 'constants1'
    p TEST_VARIABLE
    
    phrogz$ ruby constants2.rb 
    "test"
    
  2. 在main中声明的实例变量都属于同一个main

    phrogz$ cat instance1.rb 
    @test_variable = "test"
    
    phrogz$ cat instance2.rb 
    require_relative 'instance1'
    p @test_variable
    
    phrogz$ ruby instance2.rb 
    "test"
    
  3. 全局变量也是同一环境的一部分(在1.8.6,1.8.7和1.9.2中测试):

    phrogz$ cat global1.rb 
    $test_variable = "test"
    
    phrogz$ cat global2.rb 
    require_relative 'global1'
    p $test_variable, RUBY_DESCRIPTION
    
    phrogz$ ruby global2.rb 
    "test"
    "ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]"
    

答案 1 :(得分:14)

Ruby 永远不会在文件之间共享局部变量。您可以将它们包装在模块中:

module SharedVaribles
  @test_var="Hello, World"

  def self.test_var
    return @test_var
  end

  def self.test_var=(val)
    @test_val=val;
  end
end

将其放入settings.rbrequire所有文件中,然后使用SharedVaribles.test_varSharedVaribles.test_var=访问该变量。请记住,Ruby的require与C #include完全不同,它要复杂得多。它执行文件,然后将所有常量,模块和类导入require

答案 2 :(得分:2)

module Foo
  attr_accessor :test_var
  def initialize
    @test_var = "hello world"
  end
end

在配置文件中创建带有变量或变量的模块,然后将模块包含在您打算使用的任何类中。

require_relative 'foomod.rb'
class Bar
  include Foo
end

foobar = Bar.new
foobar.test_var = "goodbye"
puts foobar.test_var

该类的每个实例都将使用您想要的任何值进行初始化。

答案 3 :(得分:0)

您不需要将这些变量包装在router.get("user") { req -> Future<User> in let fbID = try req.query.get(String.self, at: "fbId") return User.query(on: req).filter(\.fbId == fbID).first().flatMap { user in let returnedUser: Future<User> if let foundUser = user { returnedUser = req.future(foundUser) } else { let newUser = User(fbId: fbID) returnedUser = newUser.save(on: req) } return returnedUser } } 中。

只需将它们添加到module并使用another_file.rb(如果它在同一目录中)或require_relative 'another_file'就足以在文件中共享这些变量。