Иногда я вижу в 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. К счастью, мой тестовый пакет поймал это, но ... внимание!