2013-05-13 2 views
1

В Ruby, я могу написать,рубин Object Model осветление

Dog = Class.new 

так вот, Dog является Object, который является экземпляром Class.

Кроме того, я могу написать

fido = Dog.new 

, которое возможно только в том случае Dog является Class.

Dog здесь a Class или Object?

+1

Это объект класса 'Class'. Итак, это класс. :) –

+0

, то почему Dog.superclass создает объект? – nik7

+5

Потому что классы - это объекты. –

ответ

5

Все в рубине Object (за исключением блоков). И Dog здесь также есть Class.

Dog = Class.new 
fido = Dog.new 

Так что ответ: как.

+0

Невозможно переварить, как вещь может быть одновременно как классом, так и объектом, нужно ли мне так предполагать или есть ресурс, на который я могу ссылаться, чтобы больше рассуждать? – nik7

+1

@nik: Почти * все * - даже класс - это объект. – cHao

+3

@nik: Собаки - это млекопитающие. Фидо - собака. Таким образом, это и собака, и млекопитающее. Различные уровни иерархии. –

5

Задать сам объект, чтобы знать, где они принадлежат, как показано ниже:

Dog = Class.new 
fido = Dog.new 
Dog.instance_of? Class #=> true 
fido.instance_of? Class #=> false 
fido.instance_of? Dog #=> true 
Dog.superclass #=> Object 
Dog.is_a? Object #=> true 
Dog.is_a? Class #=> true 

Чтобы посмотреть в более подробно см Object model Documentation

1

Я думаю, что вы делаете ошибку, что некоторые новички неоднократно делать. Вы путаете два значения из «являются»:

  • А является экземпляром В, и
  • А является подклассом Б.

С вашим делом ,

  • Dog является instan се из (но не подкласс) Class и
  • Dog является подкласс из (но не экземпляр) Object.

Таким образом, в разных смыслах это Class и является Object.

Когда они говорят, что «все в Ruby является Object», это не значит, что все является экземпляром Object. Это означает, что все является экземпляром (рефлексивного) подкласса Object.

+0

Примечание: LSP в значительной степени требует, чтобы «подкласс ** из B» был неотличим от «является экземпляром ** из B», по крайней мере, с точки зрения любого, ожидающего B. Все объекты являются экземплярами «Объекта», а также их конкретного типа, а также каждого класса по цепочке наследования. Вот почему 'instance_of?' И 'is_a?' Возвращает true, если речь идет о подклассах. – cHao

+0

instance_of? не рассматривает подклассы. вид? делает. – sawa

+0

Упс. Некоторое время я не ругался с Ruby и, по-видимому, неправильно читал пример Прити. : P Ваше второе значение для «is», похоже, не работает. Say 'Dog' является подклассом« Mammal ». Независимо от этих отношений, «« Собака »является млекопитающим» неверна. «Ровер», однако, является экземпляром * «Собака», является Собакой, Млекопитающим, * и * Объектом. «Собака» также является классом * и * Объектом, из-за расширения класса «Объект». – cHao

0

Сначала установите «y_support», введя gem install y_support в командной строке.Тогда, в IRB:

require 'y_support/name_magic' 

class Animal 
    include NameMagic 
end # You have created a new class 
Animal.name #=> "Animal" -- the class is named Animal 
class Dog < Animal 
    def speak; puts "Bow wow!" end 
end #=> hereby, you have created a subclass of Animal class 
Cat = Class.new(Animal) do 
    def speak; puts "Meow!" end 
end #=> this is another way of creating a subclass 
Dog.name #=> "Dog" -- this is a class named Dog 

А теперь

Fido = Dog.new  #=> You have created a new Dog instance 
Dog.instance_names #=> [:Fido] -- the instance is named Fido 
Stripes = Cat.new #=> You have created a new Cat instance 
Cat.instance_names #=> [:Stripes] -- the instance is named Cat 
Animal.instances.size #=> 2 -- we have 2 animals thus far 
Animal.instances.each do |animal| animal.speak end #=> Bow wow! Meow! 

Давайте создадим еще одну собаку:

Spot = Dog.new  #=> Another Dog instance 
Dog.instances.size #=> 2 -- we now have 2 dogs 
Fido.class   #=> Dog -- Fido is an instance of class Dog 
Spot.class   #=> Dog -- Spot is also an instance of class Dog 
Fido.class.ancestors #=> The output shows you that Fido is also an Animal 
Animal.instances.size #=> 3 -- together, we have 3 animals 
Animal.instance_names #=> [:Fido, :Stripes, :Spot] 
Animal.instance(:Fido).speak #=> Bow wow! 
Animal.instances.each &:speak #=> Bow wow! Meow! Bow wow! 

ПОНЯЛ? Помните, что в Ruby никогда не работает без NameMagic.