Jak udostępniać zmienne w moim.pliki rb?

Mam kilka plików .rb i chcę używać tych samych zmiennych we wszystkich z nich. Powiedzmy, że zmienna test_variable = "test" powinna być dostępna ze wszystkich moich plików .rb. Jak mogę to osiągnąć?

Utworzyłem plik settings.rb z test_variable = "test", a następnie użyłem require 'settings' w innym pliku .rb, ale nie zadziałał. Chciałbym użyć require nie load.

Próbowałem uczynić zmienną globalną przez prefiks nazwy zmiennej $, ale wciąż otrzymuję undefined local variable or method 'test_variable' for main:Object (NameError).

Author: user664833, 2011-12-01

3 answers

  1. Stałe (które zawierają moduły I klasy) są dodawane do wspólnego środowiska globalnego:

    phrogz$ cat constants1.rb 
    TEST_VARIABLE = "test"
    
    phrogz$ cat constants2.rb 
    require_relative 'constants1'
    p TEST_VARIABLE
    
    phrogz$ ruby constants2.rb 
    "test"
    
  2. Zmienne instancji zadeklarowane w main są częścią tego samego main:

    phrogz$ cat instance1.rb 
    @test_variable = "test"
    
    phrogz$ cat instance2.rb 
    require_relative 'instance1'
    p @test_variable
    
    phrogz$ ruby instance2.rb 
    "test"
    
  3. Zmienne globalne są również częścią tego samego środowiska (testowane w 1.8.6, 1.8.7 i 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]"
    
 39
Author: Phrogz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-01 03:41:55

Ruby nie będzie nigdy współdzielił zmienne lokalne między plikami. Można je jednak owinąć w moduł:

module SharedVaribles
  @test_var="Hello, World"

  def self.test_var
    return @test_var
  end

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

Put that in settings.rb, require do wszystkich plików i użyj SharedVaribles.test_var i SharedVaribles.test_var=, Aby uzyskać dostęp do zmiennej. Pamiętaj, że Ruby {[2] } w niczym nie przypomina C #include, jest znacznie bardziej złożone. Wykonuje plik, a następnie importuje wszystkie stałe, moduły I klasy do requireer.

 14
Author: Linuxios,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-15 19:15:10
module Foo
  attr_accessor :test_var
  def initialize
    @test_var = "hello world"
  end
end

Utwórz moduł ze zmienną lub zmiennymi w pliku konfiguracyjnym, a następnie dołącz moduł do dowolnej klasy, której chcesz użyć.

require_relative 'foomod.rb'
class Bar
  include Foo
end

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

Każda instancja klasy zostanie zainicjowana dowolną wartością.

 2
Author: logical_proof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-01 02:40:25