Является ли "объект контекста верхнего уровня" в 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
который может генерировать их для вас автоматически.