Эквивалент восклицательного знака для имен методов из ruby ​​на других языках - PullRequest
9 голосов
/ 17 марта 2009

В Ruby методы с побочными эффектами или методы, которые изменяют объект, переданный в качестве параметров, имеют "!" в качестве постфикса.

Например:

"SomeString".gsub!(/S/, "s")
будет менять объект String, в то время как
"SomeString".gsub(/S/, "s")
будет работать с копией объекта String и не будет изменять состояние каких-либо объектов вне метода.

Мне нравится это соглашение, и я хотел бы использовать его и при программировании на других языках.

Мой вопрос:

Реальные программисты на Ruby (я не один ;-)) действительно используют это соглашение? Если нет, то почему? Существуют ли эквивалентные соглашения для методов именования в Java, PHP, Perl, Cobol ...?

Ответы [ 4 ]

7 голосов
/ 17 марта 2009

Методы взрыва не означают «изменение приемника».

http://www.wobblini.net/bang.txt

Как вы можете видеть, Мац подразумевал, что они означают "более опасная, чем версия без восклицательного знака". Просто общий справочник, видя, что большинство ответов до сих пор упоминают о смене получателя.

3 голосов
/ 17 марта 2009

В Схеме методы с побочными эффектами или методы, которые изменяют объект, переданный в качестве параметров, имеют "!" как постфикс. Методы, которые являются предикатами, имеют «?». Другие лиспы также иногда используют это соглашение.

В Java обычно имеет тип возврата void для процедуры, которая изменяет свой получатель, и возвращает вычисленное значение для функции, которая не имеет. (Например: String.toLowerCase () возвращает новую строку, Collections.sort (List) сортирует на месте и не возвращает значение). Однако это не строгая идиома, так как часто мутирующие процедуры также должны возвращать значение.

2 голосов
/ 17 марта 2009

Я могу говорить только о языках, которые я использовал, но ... я не знаком с такими соглашениями в Python, Perl, Java, PHP, Javascript или Bash (shell).

Некоторым программистам может быть полезно поместить какой-нибудь префикс или постфикс в имена функций, чтобы указать те, которые изменяют свои аргументы, по сравнению с теми, которые создают новые «версии» аргументов и возвращают их. Если вы один из тех людей, идите вперед. Но опять же, я не знаю ничего стандартного (за исключением того, что Стивен упомянул в C и C ++).

1 голос
/ 17 марта 2009

Существует соглашение о маркировке параметров на других языках (в частности, C ++). При вызове метода отметьте параметры, которые не будут изменены, с помощью const: например,

void doSomething( const int &parameter )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...