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)
.
3 answers
-
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"
-
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"
-
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]"
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 require
er.
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ą.
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