Наследование классов Ruby: Что такое `<<` (вдвое меньше)?

class << Awesomeness

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

66 голосов | спросил Voldemort 31 Mayam11 2011, 07:06:27

3 ответа


0

Хотя верно, что class << something является синтаксисом для одноэлементного класса, как кто-то сказал, чаще всего он используется для определения методов класса в пределах определения класса. Но эти два использования соответствуют друг другу. Вот как.

Ruby позволяет добавлять методы к любому конкретному экземпляру, выполняя это:

class << someinstance
  def foo
    "Hello."
  end
end

Это добавляет метод foo к некоторому экземпляру, не к его классу, а к этому конкретному экземпляру. (На самом деле, foo добавляется в «экземплярный класс» экземпляра, но это более или менее изюминка реализации.) После выполнения приведенного выше кода вы можете отправить метод foo к некоторому экземпляру:

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 - это то же самое, что сказать «добавьте следующие методы в класс Thing». То есть 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

То же самое. Ваш пример на самом деле является синтаксической ошибкой, но если вы понимаете, как << используется с экземплярами и ключевым словом class, вы будете знать, как исправить это.

ответил Rob Davis 31 Mayam11 2011, 08:43:14
0

<< - это синтаксис для " Определение класса Singleton ". Вот пример где /как это «обычно» используется.

В a = "abc"; a << "xyz" это синтаксис «добавления данных» (в строку, массив и т. д.)

ответил Zabba 31 Mayam11 2011, 07:20:52
0

Если вы хотите наследования (в зависимости от заголовка вопроса), вам нужен один <:

class Awesome < ParentAwesomeness

Предоставленный вами код не является действительным ruby:

class Awesomeness
end

class Awesome << Awesomeness
end

SyntaxError: (irb):3: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n'
ответил Andrew Grimm 31 Mayam11 2011, 07:29:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132