Иногда я вижу в Ruby методы, в которых есть "?" и "!" в конце, например:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Мне было интересно, какова их цель? Они просто приукрашивают синтаксис?
Иногда я вижу в Ruby методы, в которых есть "?" и "!" в конце, например:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Мне было интересно, какова их цель? Они просто приукрашивают синтаксис?
Ответы:
Это «просто приукрашивание» для удобства чтения, но у них есть общие значения:
!
выполнением какого-либо постоянного или потенциально опасного изменения ; например:
Enumerable#sort
возвращает отсортированную версию объекта, а Enumerable#sort!
сортировке на месте.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
двоичные данные?».
Array#clear
Например. Очищает массив. Очистка массива естественным образом изменяет его. Ничего удивительного в этом нет, поэтому название уже ясно дает понять: никакого взрыва. См. Ruby-forum.com/topic/176830#773946 .
Знак вопроса означает, что метод возвращает логическое значение. Уже ответили здесь:
Что означает оператор вопросительного знака в Ruby?
Челка означает, что метод воздействует на сам объект. Уже ответили здесь:
В Ruby это ?
означает, что метод вернет логическое значение, а !
модифицирует объект, для которого он был вызван. Они нужны для улучшения читабельности при просмотре кода.
В отличие от - я полагаю - большинства языков программирования ...
Ruby, методы могут заканчиваться вопросительными или восклицательными знаками.
По соглашению, методы, которые отвечают на вопросы (например, Array # empty? Возвращает true, если получатель пуст), заканчиваются вопросительными знаками.
Потенциально «опасные» методы (т.е. методы, которые изменяют себя или аргументы, выход! И т. Д.) По соглашению заканчиваются восклицательными знаками.
Источник: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , Раздел Смешные названия методов
?
, называются методами предиката.
Остерегайтесь, это не всегда так. Возьмем, к примеру, Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Где можно сильно обгореть - это что-то вроде MyActiveRecordModel.column_names.concat([url])
. Более поздние вызовы, связанные с MyActiveRecordModel, будут пытаться найти столбец «url» для MyActiveRecordModel и выбросить.
Вместо этого вы должны клонировать его перед выполнением concat. К счастью, мой тестовый пакет поймал это, но ... внимание!