Как обмениваться переменными в моих файлах .rb? - PullRequest
31 голосов
/ 01 декабря 2011

У меня есть несколько .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).

Ответы [ 3 ]

44 голосов
/ 01 декабря 2011
  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]"
    
14 голосов
/ 01 декабря 2011

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= для доступа к переменной. Помните, что require в Ruby не похож на #include в C, он намного сложнее. Он выполняет файл, затем импортирует все константы, модули и классы в require er. ​​

2 голосов
/ 01 декабря 2011
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

Каждый экземпляр класса будет инициализироваться с любым желаемым значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...