#ruby #instance-variables
#ruby #переменные экземпляра
Вопрос:
Что значит создать переменную экземпляра, скажем @foo
, в файле вне какого-либо определения класса. Допустим, существует файл test.rb, и все содержимое файла приведено ниже.
# test.rb
@foo = "bar"
puts @foo
Он печатает "bar"
, но является ли это переменной экземпляра в каком-то классе упаковки?
Тестирование с использованием двух файлов показывает, что существует main
объект, внутри которого все заключено. Правильно ли это понимание?
Содержимое файла.rb
@me = self
@a = "from-a"
Содержимое b.rb
require "./a"
@b = "from-b"
puts @me == self # true (self refers to the same object)
puts self.class # Object
puts self.instance_variables # [@a, @b, @me]
Ответ №1:
В ruby все является объектом. Итак, вы на самом деле находитесь в main
объекте прямо сейчас, который является экземпляром Object
.
В вашем файле, если вы введете puts self.class
, вы увидите, что вы работаете под main
, и класс является Object
.
Даже в irb, например:
ruby-1.9.2-p136 :001 > self
=> main
ruby-1.9.2-p136 :002 > self.class
=> Object
Комментарии:
1. Является ли
main
экземпляромObject
, под которым все работает?2. как используется общий доступ к основному объекту в многопользовательском веб-приложении? например, допустим, у меня есть файл ‘x.rb’, который я импортирую в приложении Rails или Sinatra. Если один пользователь по запросу вызывает метод в этом файле, который устанавливает @a = 5, а затем другой пользователь вызывает метод в этом файле, который извлекает @a, получит ли второй пользователь значение 5? Или Rails / Sinatra создают отдельный экземпляр класса Object этого файла для каждого отдельного пользовательского запроса?