Какова цель "!"а также "?"в конце имен методов? - PullRequest
93 голосов
/ 24 августа 2011

Иногда я вижу методы в Ruby, которые имеют "?"а также "!"в конце их, например:

name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?

Мне было интересно, какова их цель?Это просто синтаксис сахарного покрытия?

Ответы [ 5 ]

150 голосов
/ 24 августа 2011

Это «просто приукрашивание» для удобства чтения, но у них есть общие значения:

  • Методы, оканчивающиеся на !, выполняют постоянные или потенциально опасные изменения ; например:
    • Enumerable#sort возвращает отсортированную версию объекта, а Enumerable#sort! сортирует ее на месте.
    • В Rails ActiveRecord::Base#save возвращает false, если сохранение не удалось, а ActiveRecord::Base#save! вызывает исключение.
    • Kernel::exit заставляет скрипт завершиться, тогда как Kernel::exit! делает это немедленно, минуя любые обработчики выхода.
  • Методы, заканчивающиеся на ?, возвращают логическое значение , что делает поток кода еще более интуитивно понятным, как предложение - if number.zero? читается как "если число равно нулю", но if number.zero просто выглядит странно.

В вашем примере name.reverse оценивается как перевернутая строка, но только после строки name.reverse! переменная name фактически содержит перевернутое имя. name.is_binary_data? выглядит как "это name двоичные данные?".

13 голосов
/ 24 августа 2011

Вопросительный знак указывает, что метод возвращает логическое значение.Уже здесь ответили:

Что означает оператор знака вопроса в Ruby?

Удар означает, что метод воздействует на сам объект.Уже здесь ответили:

Почему восклицательные знаки используются в методах Ruby?

7 голосов
/ 24 августа 2011

В Ruby ? означает, что метод будет возвращать логическое значение, а ! изменяет объект, для которого он был вызван. Они предназначены для улучшения читабельности при просмотре кода.

5 голосов
/ 24 августа 2011

В отличие от - я полагаю - большинства языков программирования ...

Ruby, методы могут заканчиваться знаком вопроса или восклицательным знаком.

По соглашению методы, которые отвечают на вопросы (например, Array # empty? Возвращает true, если получатель пуст), заканчиваются вопросительными знаками.

Потенциально «опасные» методы (т. Е. Методы, которые изменяют себя или аргументы, выходят и т. Д.) По соглашению заканчиваются восклицательными знаками.

От: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/, Раздел Смешные имена методов

0 голосов
/ 26 августа 2016

Осторожно, это не всегда так.Например, Ruby Array # concat http://docs.ruby -lang.org / ru / 2.0.0 / Array.html # method-i-concat .

Где вы можете сильно обгореть - это что-то вроде MyActiveRecordModel.column_names.concat([url]).Более поздние вызовы, связанные с MyActiveRecordModel, попытаются найти столбец 'url' для MyActiveRecordModel и выполнить команду throw.

Вместо этого вы должны клонировать его перед выполнением конкатата.К счастью, мой тестовый набор поймал этот, но .. хедз-ап!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...