Соглашение об именах: почему массив Array # delete не имеет восклицательного знака в конце?

Я изучаю Ruby, и я видел, что восклицательный знак в конце имени метода по соглашению означает, что метод каким-то образом изменяет self. Почему тогда Array#delete не заканчивается восклицательным знаком, например slice!, так как delete удаляет элемент из self? Я пропустил что-то фундаментальное?

Ответ 1

Чтобы процитировать Matz (главный инженер Ruby):

Взрыв (!) не означает "деструктивный", или его отсутствие означает разрушительный. Знак взрыва означает, что "версия взрыва больше опасный, чем его аналог неба; обращайтесь с осторожностью".

Так как Array#delete не имеет менее опасного аналога, нет необходимости в восклицании.

Ответ 2

Методы "bang" не означают, что он изменяет приемник. Это признак метода, который является более опасной версией существующего метода. См. описание Дэвида А. Черного, а ответ на запрос для изменения Ruby 2.0.

Это очень распространенное заблуждение. Обратите внимание на очень высоко оцененный неверный ответ здесь.