Почему восклицательные знаки используются в методах Ruby?

BFS не будет работать для ориентированного графика при поиске циклов. Рассмотрим A-> B и A-> C-> B как пути от A до B в графе. BFS скажет, что после прохождения по одному из путей, по которым B посещается. Продолжая движение по следующему пути, он скажет, что отмеченный узел B снова найден, следовательно, существует цикл. Очевидно, что здесь нет никакого цикла.

503
задан dreftymac 12 November 2017 в 18:44
поделиться

4 ответа

В целом методы, которые заканчиваются в !, указывают, что метод будет изменять объект, к которому он обратился . Ruby называет их как" опасные методы ", потому что они изменяют состояние, на которое у кого-то еще могла бы быть ссылка. Вот простой пример для строк:

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

Это произведет:

a string

В стандартных библиотеках, существует много мест, без которых Вы будете видеть пар столь же именованных методов, один с ! и один. Тех без называют "надежными методами", и они возвращаются, копия оригинала с изменениями относилась копия с неизменным вызываемым. Вот тот же пример без !:

foo = "A STRING"    # a string called foo
bar = foo.downcase  # doesn't modify foo; returns a modified string
puts foo            # prints unchanged foo
puts bar            # prints newly created bar

Это производит:

A STRING
a string

Имеют в виду, что это - просто конвенция, но много классов Ruby следует за нею. Это также помогает Вам отслеживать то, что становится измененным в Вашем коде.

583
ответ дан Inanc Gumus 13 November 2017 в 04:44
поделиться
  • 1
    I' ll редактируют мой ответ, чтобы попытаться сделать это в том порядке. Хорошо? – Warren P 27 April 2011 в 13:05

Восклицательный знак означает много вещей, и иногда Вы не можете сказать много от него кроме "этого, опасно, быть осторожным".

, Поскольку другие сказали в стандартных методах, это часто используется для указания на метод, который вызывает объект видоизменить себя, но не всегда. Обратите внимание, что много стандартных методов изменяют свой получатель и не имеют восклицательного знака (pop, shift, clear), и некоторые методы с восклицательными знаками не изменяют свой получатель (exit!). См. эта статья , например.

Другие библиотеки могут использовать его по-другому. В направляющих восклицательный знак часто означает, что метод выдаст исключение при отказе вместо того, чтобы перестать работать тихо.

Это - соглашение о присвоении имен, но многие люди используют его тонко различными способами. В Вашем собственном коде хорошее правило ползунков состоит в том, чтобы использовать его каждый раз, когда метод делает что-то "опасное", особенно когда два метода с тем же именем существуют, и один из них более "опасен", чем другой. "Опасный" может означать почти что-либо все же.

132
ответ дан Brian Carper 13 November 2017 в 04:44
поделиться
  • 1
    @Warren: вторая проблема с Вашим ответом (поскольку я считал его более тщательно) состоит в том что это doesn' t отвечают на фактический вопрос, который задают. Это ясно демонстрирует Ваши чувства об указателях и записях, но doesn' t обращаются к вопросу " Как делают я храню записи в TList". извините; я должен вниз-голосовать здесь. Если я отправляю вопрос " я отрезал палец с кухонным ножом в то время как прерывающие овощи. Как я останавливаю выход за край, прежде чем я выйду за край? " Ваш ответ shouldn' t быть " необходимо быть более осторожными с ножом так Вы don' t сокращают себя ". ответьте на вопрос, и затем отправьте свои мнения о других опциях. – Ken White 27 April 2011 в 00:12

! обычно средства, что метод реагирует на объект вместо того, чтобы возвратить результат. Из книги , Программируя Ruby:

Методы, которые "опасны "или изменяют получатель, можно было бы назвать с запаздыванием"!".

24
ответ дан jww 13 November 2017 в 04:44
поделиться

Это соглашение о присвоении имен снято от Соглашения о присвоении имен Схемы .

1.3.5

Условно, названия процедур, которые всегда возвращают булево значение обычно, заканчиваются в''?''. Такие процедуры называют предикатами.

Условно, названия процедур, которые хранят значения в ранее выделенные местоположения (см. раздел 3.4) обычно заканчиваются в''!''. Такие процедуры называют процедурами мутации. Условно, значение, возвращенное процедурой мутации, является неуказанным.

71
ответ дан Steven Huwig 13 November 2017 в 04:44
поделиться
  • 1
    @Warren: проблема с массивами состоит в том, что они - not' t, как легко отсортировано. Я соглашаюсь с рекомендацией типа класса, хотя; можно более легко управлять ими с TObjectList. (BTW, ^ является почти совершенно дополнительным теперь; компилятор обрабатывает большую часть из этого для Вас и Вас don' t нужен он.) – Ken White 26 April 2011 в 23:16
Другие вопросы по тегам:

Похожие вопросы: