Как обмениваться переменными через мои .rb файлы?
У меня мало файлов .rb, и я хочу использовать одни и те же переменные во всех них. Пусть говорят, что переменная test_variable = "test"
будет доступна из всех моих файлов .rb. Как я могу это сделать?
Я создал файл settings.rb с test_variable = "test"
, а затем использовал require 'settings'
в другом файле .rb, но это не сработало. Я хотел бы использовать require
not load
.
Я попытался сделать переменную global add prefix $
перед именем переменной, но я все еще получаю undefined local variable or method 'test_variable' for main:Object (NameError)
Ответы
Ответ 1
-
Константы (включая модули и классы) добавляются в общую глобальную среду:
phrogz$ cat constants1.rb
TEST_VARIABLE = "test"
phrogz$ cat constants2.rb
require_relative 'constants1'
p TEST_VARIABLE
phrogz$ ruby constants2.rb
"test"
-
Переменные экземпляра, объявленные в основном, являются частью одного и того же 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]"
Ответ 2
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
er.
Ответ 3
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
Каждый экземпляр класса инициализирует любое значение, которое вы хотели бы.