Ruby, создающий переменные экземпляра вне класса

#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 этого файла для каждого отдельного пользовательского запроса?