Какая разница между «<» и «<<» в ruby в этом случае использования? - PullRequest
0 голосов
/ 28 мая 2020

Насколько я знаю, «<» - это наследование класса от другого класса? </p>

, но я также вижу, что «<<» используется для того же, что и я,. </p>

Пример:

def catch_alarm(alarm_info, options)
  alarms = []
  alarms << AlarmMonitor.new({
        region_id: region_name,
        account_id: '10202'.
        alarm_name: alarm_info
    },
  alarms
end

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Прежде всего, < и << не одно и то же.

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
1 голос
/ 28 мая 2020

В этом контексте << - это оператор Array pu sh , поэтому он не связан с использованием < для наследования классов.

...