Ruby: Что означает "variable.property!" синтаксис? - PullRequest
0 голосов
/ 10 января 2020

Я анализирую блок кода, написанный на ruby. Я не знаю языка, и мне нужно понять операцию.

def restore
  m = ObjectName.where(prop: User.where(email: 'admin@email.com').first.element_id).last
  m.todo!
  m.waiting!
  ...
end

что такое "m.todo!" и "жду!" делают? Я не могу понять, присваивает ли оно «истинное» значение или значение, противоположное текущему, например: m.todo =! M.todo

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 10 января 2020

! и ? являются действительными частями имени метода в Ruby. У них нет особого значения, хотя ! традиционно используется для мутативных или деструктивных действий, а ? традиционно используется для методов предикатов.

В этом примере есть два метода с именем todo! и waiting! будучи призванным - ничего более причудливого. Если бы мне пришлось угадывать, это те методы, которые просто выполняют комбинированную операцию «обновить переменную состояния и сохранить» (следовательно, мутативную).

0 голосов
/ 10 января 2020

В Ruby, foo.bar - это синтаксис для отправки сообщения . Сначала он оценивает выражение foo (которое либо разыменовывает локальную переменную, либо сообщение без получателя отправляет неявному получателю self), а затем отправляет сообщение bar полученному объекту.

Один раз вы знаете, как выглядит отправка сообщения в Ruby, легко увидеть, что делает m.todo!: сначала он вычислит выражение m (которое либо разыменовывает локальную переменную, либо отправляет сообщение без получателя неявному получателю self), а затем отправьте сообщение todo! полученному объекту.

Имена методов, оканчивающиеся на !, обычно используются для обозначения «более удивительного» пары методов. Итак, если у вас есть два метода, оба из которых делают схожие вещи, то тот, который имеет удар в конце, является «более удивительным». Хорошим примером являются Process::exit и Process::exit!. Оба выходят из запущенного в данный момент процесса Ruby, но «нормальная» версия (то есть та, что без взрыва) обычно запускает обработчики выхода, тогда как «удивительная» версия немедленно завершает работу без запускающих обработчики выхода.

Примечание. Кажется, существует много недоразумений относительно соглашения об именах для методов взрыва. Итак, позвольте мне прояснить:

  1. Методы взрыва не имеют абсолютно никакого отношения к мутации или разрушению. Это просто удивление. См. Process::exit! пример выше, который не имеет ничего общего с мутацией.
  2. Методы взрыва всегда связаны с методом без взрыва. Они отмечают «более удивительный» вариант пары методов. Если нет пары методов, нет взрыва. См., Например, Array#collect!, у которого действительно есть удар, потому что это более удивительный вариант Array#collect, поскольку он мутирует своего получателя; однако Array#append не имеет не взрыва, даже если он также изменяет свой приемник, потому что не существует соответствующего "менее удивительного" метода.

что "м.тодо!" и "жду!" делают? Я не могу понять, если он присваивает «истинное» значение или значение, противоположное текущему, например: m.todo =! M.todo

Они делают все, что автор этих методов хочет. Вы должны будете найти это в документации. Это не методы ядра Ruby или стандартной библиотеки.

...