В Ruby некоторые методы имеют вопросительный знак ( ?
), который задает вопрос, подобный тому, include?
который задается , если включается рассматриваемый объект, а затем возвращает true / false.
Но почему некоторые методы имеют восклицательные знаки ( !
), а другие нет?
Что это значит?
Ответы:
Как правило, методы, заканчивающиеся на,
!
указывают, что метод будет изменять объект , к которому он обращен . Ruby называет их « опасными методами », потому что они изменяют состояние, на которое может ссылаться кто-то другой. Вот простой пример для строк:Это выведет:
В стандартных библиотеках есть много мест, где вы увидите пары методов с одинаковыми именами, один с
!
и без. Те, у кого нет, называются «безопасными методами», и они возвращают копию оригинала с изменениями, примененными к копии , с вызываемым абонентом без изменений. Вот тот же пример без!
:Это выводит:
Имейте в виду, что это просто соглашение, но многие классы Ruby следуют ему. Это также поможет вам отслеживать, что изменяется в вашем коде.
источник
save
иsave!
вActiveRecord
Восклицательный знак означает много вещей, и иногда вы не можете многое сказать из этого, кроме «это опасно, будьте осторожны».
Как уже говорили другие, в стандартных методах он часто используется для обозначения метода, который заставляет объект мутировать сам, но не всегда. Обратите внимание , что многие стандартные методы меняют свой приемник и не имеют восклицательный знак (
pop
,shift
,clear
), а также некоторые методы с восклицательными знаками не меняют свой приемник (exit!
). Смотрите эту статью для примера.Другие библиотеки могут использовать его по-другому. В Rails восклицательный знак часто означает, что метод будет генерировать исключение при сбое, а не молча.
Это соглашение об именах, но многие люди используют его немного по-разному. В вашем собственном коде хорошее правило - использовать его всякий раз, когда метод делает что-то «опасное», особенно когда существуют два метода с одинаковым именем, и один из них более «опасен», чем другой. «Опасный» может означать почти все что угодно.
источник
Это соглашение об именах взято из Схемы .
источник
! обычно означает, что метод воздействует на объект, а не возвращает результат. Из книги « Программирование на Ruby» :
источник
Наиболее точно можно сказать, что методы на ура! являются более опасной или удивительной версией. Есть много методов, которые мутируют без взрыва, таких как
.destroy
и вообще методы имеют взрыва только там, где в базовой библиотеке существует более безопасная альтернатива.Например, на массиве у нас есть
.compact
и.compact!
оба метода мутировать массив, но.compact!
возвращает NIL вместо себя , если нет нильполугруппы находится в массиве, что более удивительно , чем просто возвращение себя.Только не мутирует метод , который я нашел с челкой это
Kernel
«s ,.exit!
который более удивительно , чем.exit
потому , что вы не можете поймать вSystemExit
то время как процесс закрытия.Rails и ActiveRecord продолжают эту тенденцию в том смысле, что они используют взрыв для более «удивительных» эффектов, например,
.create!
которые вызывают ошибки при сбое.источник
С themomorohoax.com:
Взрыв может использоваться следующими способами, в порядке моих личных предпочтений.
Суть в том, что используйте удар, только когда вы действительно подумали о необходимости, чтобы избавить других разработчиков от необходимости проверять, почему вы используете удар.
Взрыв предоставляет две подсказки другим разработчикам.
http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods
источник
Простое объяснение:
Но если бы вы когда-либо вызывали метод
downcase!
в приведенном выше объяснении,foo
он постоянно изменялся бы на downcase.downcase!
не будет возвращать новый строковый объект, но заменит строку на месте, полностью изменив значениеfoo
на нижний регистр. Я предлагаю вам не использовать,downcase!
если это не является абсолютно необходимым.источник
Мне нравится думать об этом как о взрывном изменении, которое разрушает все, что было до него. Взрыв или восклицательный знак означает, что вы вносите постоянное сохраненное изменение в свой код.
Если вы используете, например, метод Ruby для глобальной замены,
gsub!
то сделанная вами замена является постоянной.Еще один способ представить это - открыть текстовый файл и выполнить поиск и замену с последующим сохранением.
!
делает то же самое в вашем коде.Еще одно полезное напоминание, если вы пришли из мира bash, -
sed -i
это аналогичный эффект внесения постоянных сохраненных изменений.источник
Называется «Разрушительные методы». Они имеют тенденцию изменять оригинальную копию объекта, на который вы ссылаетесь.
источник
Итог:
!
методы просто меняют значение объекта, к которому они обращаются, тогда как метод без!
возвращает манипулируемое значение без записи поверх объекта, к которому был вызван метод.Используйте, только
!
если вы не планируете нуждаться в исходном значении, хранящемся в переменной, для которой вы вызвали метод.Я предпочитаю делать что-то вроде:
ИЛИ
Вместо
На всякий случай, я бы хотел снова получить доступ к исходному значению.
источник
!
мутирует объект, а не возвращает измененную копию.User.create!