Прежде всего, <
и <<
не одно и то же.
Ruby - как и многие другие языки программирования - использует инфиксную нотацию для двоичного операторы , например:
левая сторона оператор правая часть
Например:
1 + 2
a - b
i >= j
x << y
Но, в отличие от многих других языков, операторы реализованы как методы в Ruby. Так что это на самом деле:
получатель метод аргумент
Если вы хотите знать, что делает alarms << AlarmMonitor.new(...)
, вы необходимо знать, что это за объект alarms
. В вашем примере это массив (alarms = []
), поэтому метод имеет вид Array#<<
:
ary << obj → ary </h3> Append - Push заданный объект в конец этого массива. Это выражение возвращает сам массив, поэтому несколько добавлений могут быть связаны вместе.
Обратите внимание, что разные объекты (или классы) могут реализовывать один и тот же оператор по-разному:
a = [1, 2]
a << 3 # pushes 3 onto the array, i.e. [1, 2, 3]
d = Date.new(2020, 5, 28)
d << 3 # returns a date 3 months earlier, i.e. 2020-02-28
i = 0b00001011
i << 3 # shifts the bits 3 to the left, i.e. 0b01011000
Поведение в первую очередь зависит от получателя.
Давайте вкратце вернемся к <
. Помимо методов, Ruby имеет ключевых слов . Ключевые слова иногда работают как методы, но у них есть свои собственные правила синтаксического анализа.
Для создания класса Ruby имеет ключевое слово class
:
class MyClass
# ...
end
, которое принимает дополнительный подкласс через:
class MySubclass < MyClass
# ...
end
Здесь <
не оператор, а часть синтаксиса ключевого слова class
.
Однако есть также оператор <
для классов: Module#<
. Его можно использовать, чтобы проверить, является ли MySubclass
подклассом MyClass
: (таким образом, отражая синтаксис создания класса)
MySubclass < MyClass
#=> true