Запуск другого рубинового скрипта с неповрежденными глобальными переменными? - PullRequest
3 голосов
/ 19 января 2012

По причинам, которые немного сложно объяснить, мне нужно сделать следующее: у меня есть файл master.rb, который устанавливает некоторые глобальные значения, такие как: a = 1.Я хочу вызвать другой файл other_file.rb, который будет работать с глобальными переменными, которые были установлены в мастер-файле.В python я бы использовал runpy.run_module( 'other_module', globals() ).

Может кто-нибудь придумать эквивалент в Ruby?Я посмотрел на require, include и load, но, похоже, ни один из них не делает то, что мне нужно, в частности, они не тянут глобалы в other_file.rb.Обратите внимание, что я не пытаюсь форкировать новый процесс, просто передаю выполнение «other_module», сохраняя состояние глобальных переменных.

Ответы [ 2 ]

4 голосов
/ 19 января 2012

Если вы абсолютно обязаны , вы можете использовать глобальные переменные, и они объявлены с префиксом $. Они крайне обескуражены, потому что существует только одно глобальное пространство имен, которое делает возможным столкновения. Обычно они используются для настройки интерпретатора, например $LOAD_PATH.

Лучше использовать модуль с переменными экземпляра:

module MyContainer
  def self.settings
    @settings ||= { }
  end
end

MyContainer.settings[:foo] = :bar

Это имеет преимущество в том, что ваши переменные содержатся в пространстве имен, но не мешают другим подпрограммам получать к ним доступ.

Имейте в виду, что это будет работать только в контексте того же процесса Ruby или дочерних процессов, созданных с помощью fork, поэтому использование system или exec не будет работать. Помните также, что разветвленные процессы должны использовать IPC для связи со своим родителем.

4 голосов
/ 19 января 2012

a=1 не глобальная переменная, это локальная переменная, которая попадает в область видимости файла.Если вам действительно нужно это поведение, используйте $a=1 для установки глобальных переменных.

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