#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