Подтвердить что ты не робот

Хорошее объяснение модели объекта ruby ​​- в основном, "классы - это объекты"?

Я изучаю модель объекта ruby ​​и задаю несколько вопросов. Я понимаю идею, что объект хранит только переменные экземпляра, а методы хранятся в классе, к которому относится объект. Я также понимаю идею "я" - что это такое, как он меняется и т.д.

Однако я не понимаю, что "классы - это объекты". Есть ли хорошее, интуитивное объяснение где угодно?

(BTW: Я использую Ruby Object Model и Metaprogramming и Метапрограммирование Ruby в качестве моих двух ресурсов. Если кто-нибудь может предложить что-то еще, это будет полезно.)

Спасибо.

4b9b3361

Ответ 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 и знают, как создавать другие объекты на основе их собственного образа.