Наследование класса 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'