Наследование класса Ruby: что такое `
class << Awesomeness
что это <<
для чего? Я искал, но результаты говорят мне только о конкатенации строк...
3 ответа:
а это правда, что
class << something
это синтаксис для одноэлементного класса, как кто-то еще сказал, он чаще всего используется для определения методов класса в определении класса. Но эти два обычая последовательны. Вот как это делается.Ruby позволяет добавлять методы к любому конкретному экземпляру, делая это:
class << someinstance def foo "Hello." end end
это добавляет метод
foo
к некоторому экземпляру, но не к его классу, а к этому конкретному экземпляру. (На самом деле, foo добавляется в экземпляр " singleton class," но это более или менее причуда реализации.) После выполнения вышеуказанного кода Вы можете отправить метод foo в someinstance:someinstance.foo => "Hello."
но вы не можете отправить foo в другие экземпляры того же класса. Вот что
<<
номинально для. Но люди чаще используют эту функцию для синтаксической гимнастики следующим образом:class Thing def do_something end class << self def foo puts "I am #{self}" end end end
когда этот код-это определение класса ... выполняет, что такое
self
? Это классThing
. Что означаетclass << self
это то же самое, что сказать "добавьте следующие методы в классе."То есть Foo-это метод класса. После завершения, вы можете сделать это:t = Thing.new t.do_something => does something t.class.foo => "I am Thing" t.foo => NoMethodError: undefined method `foo'
а когда думаешь о чем
<<
делает, все это имеет смысл. Это способ добавления к определенному экземпляру, и в общем случае экземпляр, к которому добавляется, является классом, поэтому методы внутри блока становятся методами класса.короче говоря, это краткий способ создания методов класса в блоке определения класса. Другой способ был бы сделать это:
class Thing def self.foo # ... end end
то же самое. Ваш пример на самом деле синтаксическая ошибка, но если вы понимаете, как
<<
используется с экземплярами и ключевым словом класса, вы будете знать, как его исправить.
<<
синтаксис "определение одного класса". вот пример где /как он" обычно " используется.на
a = "abc"; a << "xyz"
это синтаксис для "добавления данных" (в строку, массив и т. д.)
Если вы хотите наследование (на основе названия вашего вопроса), Вы хотите один
<
:class Awesome < ParentAwesomeness
код, который вы предоставляете, недействителен ruby:
class Awesomeness end class Awesome << Awesomeness end SyntaxError: (irb):3: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n'