Хорошее объяснение модели объекта ruby - в основном, "классы - это объекты"?
Я изучаю модель объекта ruby и задаю несколько вопросов. Я понимаю идею, что объект хранит только переменные экземпляра, а методы хранятся в классе, к которому относится объект. Я также понимаю идею "я" - что это такое, как он меняется и т.д.
Однако я не понимаю, что "классы - это объекты". Есть ли хорошее, интуитивное объяснение где угодно?
(BTW: Я использую Ruby Object Model и Metaprogramming и Метапрограммирование Ruby в качестве моих двух ресурсов. Если кто-нибудь может предложить что-то еще, это будет полезно.)
Спасибо.
Ответы
Ответ 1
Это означает, что это похоже: классы - это объекты. В частности, это экземпляры класса Class
, который сам по себе является подклассом класса Module
, который, в свою очередь, является подклассом Object
, как и любой другой класс в Ruby. Как и любой другой объект Ruby, класс может отвечать на сообщения, иметь свои собственные переменные экземпляра и т.д.
В качестве практического примера возьмем private
.
class Person
attr_accessor :name, :height
private
attr_accessor :weight
end
Это дает экземплярам публичных методов Person доступ к имени и высоте человека, но аксессоры для веса человека являются закрытыми. BUTBUTBUT - вместо того, чтобы быть ключевым словом, как на большинстве языков, private
является обычным методом класса Module. Если бы мы хотели, мы могли бы переопределить его, чтобы сделать что-то другое для определенной иерархии классов.
class RichardStallman
def self.private(*args)
puts "NO! INFORMATION WAS MEANT TO BE FREE!"
end
end
Ответ 2
Вот мой выстрел в один.
В Ruby классы - это объекты. Обычно они имеют класс Class
. Например, рассмотрим класс Foo
.
class Foo
end
Несомненно, вы видели это раньше, и это не очень интересно. Но мы могли бы также определить Foo
следующим образом:
Foo = Class.new
Так же, как вы создали новый Foo
, вызывая Foo.new
, вы можете создать новый Class
, вызвав Class.new
. Затем вы присваиваете этому классу имя Foo
, назначая его, как и любую другую переменную. Это все, что нужно.
Ответ 3
Понятие "классы - объекты" (как я понимаю) подразумевает, что все, что вы можете сделать с объектом, вы можете сделать с классом.
Это отличается от других языков программирования, где класс и определение класса являются специальными артефактами, отличными от объектов и часто недоступными для среды выполнения.
Например, в Ruby вы можете модифицировать любой объект во время выполнения, поскольку классы также являются объектами, которые вы можете модифицировать самим классом, и добавлять методы во время выполнения, методы удаления или добавлять и удалять атрибуты во время выполнения.
Например:
$ irb
>> x = Object.new
=> #<Object:0x1011ce560>
>> x.to_s
=> "#<Object:0x1011ce560>"
>> undef to_s
=> nil
>> x.to_s
NoMethodError: undefined method `to_s' for #<Object:0x1011ce560>
from (irb):4
>>
Это невозможно на других языках программирования, где проводится различие между объектами и классами.
Примечание. Вероятно, вы должны понимать базовые концепции Ruby перед тем, как перейти к метапрограммированию, поскольку это может сбивать с толку, что бы я сделал.
Ответ 4
Посмотрите эту статью, вам может быть полезно:
Объектная модель Ruby - структура и семантика
Лично я много узнал о объектной модели Ruby, прочитав о Smalltalk (например, в документации Squeak). И в зависимости от того, насколько свободно вы находитесь на C, источники МРТ вполне доступны и дают наиболее определенные ответы.
Ответ 5
Когда вы думаете об этом, для new
вполне логично быть функцией, верно? Функция, которая создает и возвращает новый объект. (В отличие от большинства других языков, где new
- это какой-то оператор или языковая конструкция.)
Нажав еще дальше, еще более логичным для этой функции new
является то, что это должен быть метод, если мы говорим о языке OO. Чей метод? Метод объекта, всего лишь немного другого типа объекта, который мы можем назвать "классом".
Итак, глядя таким образом, классы - это просто специальные виды объектов, объекты, которые среди других особенностей имеют метод new
и знают, как создавать другие объекты на основе их собственного образа.