Хорошее объяснение модели объекта ruby ​​- главным образом, «классы - это объекты»? - PullRequest
12 голосов
/ 03 марта 2010

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

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

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

Спасибо.

Ответы [ 5 ]

11 голосов
/ 03 марта 2010

Это точно означает, как это звучит - классы являются объектами. В частности, они являются экземплярами класса Class, который сам является подклассом класса Module, который, в свою очередь, является подклассом Object, как и любой другой класс в Ruby. Как и любой другой объект в Ruby, класс может отвечать на сообщения, иметь собственные переменные экземпляра и т. Д.

В качестве практического примера возьмем private.

class Person
  attr_accessor :name, :height
  private
  attr_accessor :weight
end

Это дает экземплярам открытых методов Person для доступа к имени и росту человека, но средства доступа к весу человека являются частными. НО - но вместо того, чтобы быть ключевым словом, как в большинстве языков, private является обычным методом класса Module. Если бы мы хотели, мы могли бы переопределить его, чтобы сделать что-то другое для конкретной иерархии классов.

class RichardStallman
  def self.private(*args)
    puts "NO! INFORMATION WAS MEANT TO BE FREE!"
  end
end
9 голосов
/ 03 марта 2010

Вот мой выстрел в один.

В Ruby классы являются объектами. Обычно они имеют класс Class. Например, давайте рассмотрим класс Foo.

class Foo
end

Несомненно, вы видели это раньше, и это не очень интересно. Но мы могли бы также определить Foo так:

Foo = Class.new

Подобно тому, как вы создадите новый Foo, вызвав Foo.new, вы можете создать новый Class, вызвав Class.new. Затем вы присваиваете этому классу имя Foo, присваивая его, как и любая другая переменная. Это все, что нужно сделать.

5 голосов
/ 03 марта 2010

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

Это отличается от других языков программирования, где класс и определение класса являются особыми артефактами, отличными от объектов и часто недоступными для среды выполнения.

Например, в 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, прежде чем переходить к метапрограммированию, так как это может сбить с толку то, что я бы сделал.

1 голос
/ 04 марта 2010

Посмотрите на эту статью, вы можете найти ее полезной:

Модель объектов Ruby - структура и семантика

Лично я многое узнал об объектной модели Ruby, прочитав о Smalltalk (например, в документации Squeak ). И в зависимости от того, насколько хорошо вы говорите на C, источники МРТ достаточно доступны и дают наиболее точные ответы.

0 голосов
/ 03 марта 2010

Когда вы думаете об этом, вполне логично, что new является функцией, верно? Функция, которая создает и возвращает новый объект. (В отличие от большинства других языков, где new - это оператор или языковая конструкция.)

Если продвинуться дальше, еще более логично для этой функции new то, что это должен быть метод, если мы говорим о ОО-языке. Чей метод? Метод объекта, просто немного другой вид объекта, который мы можем назвать «класс».

Таким образом, классы - это просто особые виды объектов, объекты, которые, помимо прочих особенностей, имеют метод new и знают, как создавать другие объекты на основе собственного изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...