Наследование класса Ruby: что такое `


class << Awesomeness

что это << для чего? Я искал, но результаты говорят мне только о конкатенации строк...

3 63

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'