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

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

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

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

Спасибо.

12 голосов | спросил Pranav 3 MarpmWed, 03 Mar 2010 21:58:08 +03002010-03-03T21:58:08+03:0009 2010, 21:58:08

5 ответов


0

Это означает, что именно это звучит - классы являются объектами. В частности, они являются экземплярами класса 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
ответил Chuck 3 MarpmWed, 03 Mar 2010 22:34:21 +03002010-03-03T22:34:21+03:0010 2010, 22:34:21
0

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

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

class Foo
end

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

Foo = Class.new

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

ответил David Seiler 3 MarpmWed, 03 Mar 2010 22:21:25 +03002010-03-03T22:21:25+03:0010 2010, 22:21:25
0

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

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

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

ответил OscarRyz 3 MarpmWed, 03 Mar 2010 22:21:28 +03002010-03-03T22:21:28+03:0010 2010, 22:21:28
0

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

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

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

ответил Michael Kohl 4 MaramThu, 04 Mar 2010 11:26:30 +03002010-03-04T11:26:30+03:0011 2010, 11:26:30
0

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

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

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

ответил Mladen Jablanović 3 MarpmWed, 03 Mar 2010 23:03:01 +03002010-03-03T23:03:01+03:0011 2010, 23:03:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132