Правильно ли я понимаю объекты в Ruby?

#ruby #oop #object

#ruby #ооп #объект

Вопрос:

Я чувствую, что это имеет фундаментальное значение для моего понимания Ruby и объектно-ориентированного программирования в целом, поэтому я задаю этот довольно упрощенный вопрос здесь, рискуя выглядеть глупо. Я поиграл с irb. Я создал свой первый класс:

 $ irb
ruby-1.9.2-p290 :001 > class Person
ruby-1.9.2-p290 :002?>   attr_accessor :firstname, :lastname, :gender
ruby-1.9.2-p290 :003?>   end
 => nil 
ruby-1.9.2-p290 :004 > person_instance = Person.new
 => #<Person:0x007f9b7a9a0f70> 
ruby-1.9.2-p290 :005 > person_instance.firstname = "Bob"
 => "Bob" 
ruby-1.9.2-p290 :006 > person_instance.lastname = "Dylan"
 => "Dylan"
ruby-1.9.2-p290 :007 > person_instance.gender = "male"
 => "male"
  

Итак Person.new , мой объект, верно? Или мой объект представляет собой комбинацию class Person и атрибуты, которые я определил для этого класса?

Комментарии:

1. Технически они оба являются объектами. Person.new является экземпляром Person класса.

2. 1 за смелость задать вопрос, несмотря на риск выглядеть глупо. «Единственный глупый вопрос — это тот, который не задан», — гласит поговорка…

3. Как правило, большинству людей сложно называть классы объектами, поскольку объекты чаще всего относятся к экземпляру класса. Я бы предпочел, чтобы люди говорили «класс», когда ссылаются на класс, и возражали против созданного экземпляра.

4. Person.new.class #=> Person Person.class #=> Class . Class.class #=> Class . ClassClass заставил меня ругаться, когда я впервые изучал ООП.

Ответ №1:

Ваш объект является результатом выполнения Person.new , в котором вы зафиксировали person_instance .

В ruby атрибуты фактически не существуют до тех пор, пока они не будут записаны впервые, поэтому раньше person_instance.firstname = "Bob" у вашего экземпляра не было атрибутов. После выполнения этого оператора у него есть @firstname атрибут, но нет других.

Ответ №2:

Вы правы. Все в ruby является объектом. Итак, когда вы создаете новый класс ‘person’, он сам является объектом типа class .

Комментарии:

1. Вы имеете в виду «новый класс Person сам по себе …»?

2. @AndrewGrimm да, именно это я и имел в виду!

Ответ №3:

Строки тоже являются объектами, поэтому после того, как вы сделали

 person_instance.firstname = "Bob"
  

затем person_instance.firstname ссылается на строковый объект. Итак, вы можете вызвать

 # Returns String, indicating that the object returned by 
# person_instance.firstname is an instance of the String class.
person_instance.firstname.class 
# Returns a not very informative number, but indicates that it is its own object
person_instance.firstname.object_id