Является ли "объект контекста верхнего уровня" в Ruby похожим на глобальный контекст в JavaScript?

Предположим, я пишу скрипт на Ruby без определения класса. Я все еще могу создавать переменные класса и переменные экземпляра уровня класса:

@@var = "class variable!";
@var = "class instance variable!";

puts @@var;
puts @var;

Эти переменные принадлежат объекту контекста верхнего уровня.

Является ли этот объект контекста верхнего уровня похожим на глобальный контекст в JavaScript в том смысле, что он может служить своего рода пространством имен верхнего уровня? Например, есть ли способ сделать что-то подобное в Ruby, используя "объект контекста верхнего уровня"?

var arrStore1 = new Ext.data.ArrayStore({/*...*/});
/* same call again, using the global context object */
var global = window;
var arrStore2 = new global.Ext.data.ArrayStore({/*...*/});

2 ответа

Объект верхнего уровня похож на любой другой объект ruby. Вы можете включить модули в него, он может иметь переменные экземпляра. Но это не совсем глобальный контекст.

Для более подробной информации смотрите SO: Что такое "main" в Ruby?

Почти всегда лучше создать какую-либо запись пространства имен верхнего уровня и поместить туда свои глобальные или квазиглобальные переменные:

module GlobalOptions
  def self.option
    @option
  end

  def self.option=(value)
    @option = value
  end
end

GlobalOptions.option = :foo
GlobalOptions.option
# => :foo

Внутри Rails у вас есть mattr_accessor который может генерировать их для вас автоматически.

Другие вопросы по тегам