Что оператор << делает с методами ruby? - PullRequest
0 голосов
/ 18 февраля 2012

Я знаю, что оператор << используется для appending an object to a collection, а также string.

Что делает оператор << в следующих фрагментах кода?

 module TriangleBox
    def available_width
      height + 25
    end
  end

  Prawn::Text::Box.extensions << TriangleBox

Я нашел это в самоцвете креветок примеры страница.

Ответы [ 3 ]

3 голосов
/ 18 февраля 2012

Не думай об этом как о операторе.Думайте об этом как о методе, который имеет некоторый синтаксический сахар, чтобы он выглядел как оператор.

Код

Prawn::Text::Box.extensions << TriangleBox

фактически вызывает

Prawn::Text::Box.extensions.<<(TriangleBox)

Что такоеэтим методом занимаешься?Короче говоря, невозможно узнать, не прочитав документацию по Prawn (хотя мы можем догадаться, что это переопределение метода available_width по умолчанию, добавив модуль, который он расширяет).Вы можете определить метод <<, чтобы делать все, что вы хотите. </p>

class Silly
  def <<(anything)
    puts "I hate chicken"
  end
end

a = Silly.new
a << 73
=> I hate chicken
1 голос
/ 18 февраля 2012

Он добавляет элемент в коллекцию.

Как именно это происходит, скрыто от вас.Возможно, Prawn::Text::Box.extensions просто возвращает обычный массив, в этом случае это поведение по умолчанию.Но может также случиться так, что это какой-то другой класс, и ребята из Prawn написали пользовательский оператор << для выполнения любой работы, необходимой для установки расширения.

К сожалению, нет простого способа сказать, если не считатькопаясь в источнике, выясняя, что такое класс Prawn::Text::Box.extensions, а затем, если у него определена пользовательская функция <<.К счастью, все это с открытым исходным кодом на github ...

Надеюсь, что это помогает (и удачи, если вы продолжаете копать)!

1 голос
/ 18 февраля 2012

Вы сказали это сами: это «добавление объекта в коллекцию».В этом случае объектом является модуль TriangleBox, а коллекцией является Prawn::Text::Box.extensions, который выглядит как Array.

...