Вот классная вещь, 100
тоже объект. Таким образом, a
указывает на постоянный объект 100
, и когда вы присвоили b = a
, вы присвоили b
указателю на объект 100
, а не указателю для a
или даже значению 100, удерживаемому a
.
Чтобы убедиться в этом, попробуйте следующее:
irb> puts 100.object_id
=> 201
Круто, да?
Вот небольшое объяснение объектной модели Ruby, которую я написал некоторое время назад. Это не относится к вашему вопросу, но добавляет немного больше знаний о том, как работает объектная модель Ruby:
Когда вы создаете экземпляр объекта, вы создали новый объект с набором переменных экземпляра и указателем на класс объекта (и некоторыми другими вещами, такими как идентификатор объекта и указатель на суперкласс. ) но сами методы не в экземпляре объекта. Определение класса содержит список методов и их код (и указатель на его собственный класс, указатель на его суперкласс и идентификатор объекта).
Когда вы вызываете метод в экземпляре, Ruby ищет класс экземпляра и ищет в списке методов этого класса метод, который вы вызвали. Если он не находит его, он выглядит в суперклассе класса. Если он не находит его там, он смотрит в суперкласс этого класса, пока в нем не заканчиваются суперклассы. Затем он возвращается к первому классу и ищет метод method_missing. Если он не находит его, он переходит к суперклассу и так далее, пока не доберется до корневого объекта, где он предназначен для создания ошибки.
Допустим, например, у вас есть класс Person, и вы создаете экземпляр класса с переменной bubba следующим образом:
class Person
attr_accessor :dob, :name
def age
years = Time.now.year - @dob.year
puts "You are #{years} year#{"s" if years != 1} old"
end
def feed
puts "nom, nom, nom"
end
end
bubba = Person.new
bubba.name = "Bubba"
bubba.dob = Time.new(1983,9,26)
Диаграмма классов будет выглядеть примерно так:
![alt text](https://i.stack.imgur.com/XFleq.jpg)
Так что же происходит, когда вы создаете статический метод, метод класса / модуля? Хорошо, помните, что почти все является объектом в Ruby, а определение модуля является экземпляром класса Class. Да, тот код, который вы вводите, на самом деле тоже экземпляр, это живой код. Когда вы создаете метод класса с помощью def self.method_name, вы создаете метод в экземпляре объекта, который является определением класса / модуля.
Отлично, так где же этот метод класса определяется у вас? Он определяется в анонимном классе (он же singleton, eigen, ghost class), который создан именно по этой причине.
Возвращаясь к нашему классу Person, что если мы добавим метод класса к экземпляру bubba следующим образом:
def bubba.drive_pickup
puts "Yee-haw!"
end
Этот метод помещается в специальный синглтон-класс, созданный только для этого экземпляра, и суперкласс синглтона теперь является классом Person. Это делает нашу цепочку вызова метода похожей на это:
![alt text](https://i.stack.imgur.com/wIliX.jpg)
Любые другие методы, определенные для объекта-экземпляра bubba, также будут помещены в этот одноэлементный класс. В каждом объекте экземпляра никогда не бывает более одного одноэлементного класса.
Итак, чтобы обернуть все это, причина, по которой это не работает, состоит в том, что статические методы в модулях определяются в классе singleton для экземпляра определения модуля. Когда вы включаете или расширяете модуль, вы добавляете указатель на таблицу методов модуля, но не таблицу методов объекта экземпляра синглтон-класса для модуля.
Думайте об этом так: если вы создаете экземпляр x типа Z и экземпляр y типа Z, должен ли x знать о y? Нет, если только об этом конкретно не сказано. Также и ваш модуль, который смешивается с другим модулем, не должен знать о каком-то другом объекте, который, как оказалось, имеет этот первый модуль в качестве своего суперкласса.
Чтобы получить более полное объяснение объектной модели Ruby, посмотрите это потрясающее бесплатное видео с удивительно эрудированным Дейвом Томасом (нет, не парень из Венди):
http://scotland -on-rails.s3.amazonaws.com / 2A04_DaveThomas-SOR.mp4
После просмотра этого видео я купил целую серию Дэйва Томаса о объектной модели Ruby у Pragmatic, и она того стоила.
P.S. Любой, пожалуйста, не стесняйтесь поправлять меня во всем, что я забыл; как то, что конкретно в объекте.