Рубин синглтон класс - PullRequest
       10

Рубин синглтон класс

3 голосов
/ 27 сентября 2011

Я не уверен в разнице между этим.

def String.hello  
  puts "hello there"   
end

и

x = Person.new    
def x.hello    
  puts "hello there"    
end

Насколько я понимаю, второй блок кода создаст объект класса Person.Когда я выполняю def x.hello , он создает анонимный класс (синглтон-класс), который сначала проверяется на наличие методов при отправке сообщения объекту x .

Это тот же самый случай для def String.hello ?Строка это просто экземпляр класса Class правильно?Я читал, что выполнение def String.hello добавит метод в качестве одного из методов класса String .... это будет отличаться от создаваемого анонимного класса, который находится между объектом и его классом, где онполучает методы экземпляра.

Что происходит с обоими блоками кода выше?

Ответы [ 3 ]

6 голосов
/ 27 сентября 2011

Мне нравится эта часть рубина. Существует прекрасная симметрия, в которой большинство основных функций просто приукрашивают расширенные функциональные возможности, поэтому, как только вы полностью освоите концепцию, вы сможете применить это понимание ко многим языкам.

Это тот же самый случай для def String.hello? Строка является просто экземпляром класса Class правильно?

Да, вы создаете экземпляр класса и присваиваете его константе.

Я читал, что выполнение def String.hello добавит метод в качестве одного из методов класса String .... это будет отличаться от создаваемого анонимного класса, который находится между объектом и его классом, где он получает свой экземпляр. методы.

Нет, часть, которую вы пропустили, думает, что возможно иметь метод уровня класса БЕЗ добавления его в одноэлементный класс. У вас есть объект, который является экземпляром Class, и вы добавляете методы в неявный класс, который находится между ним и Class. Вы также увидите этот синтаксис иногда

class << self
  def method
  end
end

Это делает то же самое, просто очень откровенно об этом.

2 голосов
/ 27 сентября 2011

Просто добавьте к ответу Мэтта:

Оба примера делают одно и то же, записывая их по-другому:

String = Class.new # < done inside ruby initialization    
def String.hello    
  puts "hello there"    
end

и

x = Person.new    
def x.hello    
  puts "hello there"    
end

Вкл.В Ruby вы можете добавлять методы в класс, созданный с помощью A = Class.new или с синтаксисом sugar class A; ...; end, или в собственный класс, который существует для каждого объекта.Методы класса, по сути, являются методами собственного класса экземпляра класса, думают о том, что является «я» в def self.method; ...; end.Собственные классы могут быть открыты с помощью этого синтаксиса:

x = Person.new
class << x
  # ...
end

Поскольку собственные классы также являются экземплярами класса (попробуйте добавить p self.class в последнем примере), у них также есть собственные классы и так далее.Если это кажется странным, просто помните, что Object - это класс, а Class - это объект.Вот почему я люблю Руби!

0 голосов
/ 27 сентября 2011

Следующий код добавит метод "hello" в класс String, таким образом, все следующие строки будут иметь метод "hello":

def String.hello  
   puts "hello there"   
end

Хотя следующий код добавит метод "hello" в экземпляр x класса Person. Если вы создадите новую персону, у этого объекта не будет метода "привет".

x = Person.new    
def x.hello    
  puts "hello there"    
end

В этом, насколько я понимаю, главное отличие.

Помогает ли это?

...