我有几个.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)
。
答案 0 :(得分:44)
将常量(包括模块和类)添加到共享全局环境中:
phrogz$ cat constants1.rb
TEST_VARIABLE = "test"
phrogz$ cat constants2.rb
require_relative 'constants1'
p TEST_VARIABLE
phrogz$ ruby constants2.rb
"test"
在main中声明的实例变量都属于同一个main
:
phrogz$ cat instance1.rb
@test_variable = "test"
phrogz$ cat instance2.rb
require_relative 'instance1'
p @test_variable
phrogz$ ruby instance2.rb
"test"
全局变量也是同一环境的一部分(在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.rb
,require
所有文件中,然后使用SharedVaribles.test_var
和SharedVaribles.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'
就足以在文件中共享这些变量。