Я изучаю Ruby, и я видел, что восклицательный знак в конце имени метода по соглашению означает, что метод каким-то образом изменяет self
. Почему тогда Array#delete
не заканчивается восклицательным знаком, например slice!
, так как delete
удаляет элемент из self
? Я пропустил что-то фундаментальное?
Соглашение об именах: почему массив Array # delete не имеет восклицательного знака в конце?
Ответ 1
Чтобы процитировать Matz (главный инженер Ruby):
Взрыв (!) не означает "деструктивный", или его отсутствие означает разрушительный. Знак взрыва означает, что "версия взрыва больше опасный, чем его аналог неба; обращайтесь с осторожностью".
Так как Array#delete
не имеет менее опасного аналога, нет необходимости в восклицании.
Ответ 2
Методы "bang" не означают, что он изменяет приемник. Это признак метода, который является более опасной версией существующего метода. См. описание Дэвида А. Черного, а ответ на запрос для изменения Ruby 2.0.
Это очень распространенное заблуждение. Обратите внимание на очень высоко оцененный неверный ответ здесь.