Использование специальных символов в именах функций

В Ruby стандартным соглашением является использование знака вопроса в конце имени метода, чтобы указать, что метод возвращает логический результат:

[].empty?   #=> true 

Другое стандартное соглашение заключается в том, чтобы оканчивать имя метода восклицательным знаком, если метод деструктивен (то есть он изменяет исходные данные):

mylist.sort! # sort mylist in-place

Недавно я видел те же самые соглашения, используемые в Схеме. Что заставляет меня задуматься, какие другие языки используют / поддерживают это соглашение? Существуют ли какие-либо другие специальные символы, которые обычно используются для именования этими или другими языками?

4 ответа

Решение

Ответ, конечно же, зависит от языка (и языковой культуры).

Например, в зависимости от языка подходят все следующие: empty-p, empty?, empty, is_empty или isEmpty. (Эти примеры, конечно, не включены).

Примеры в оригинальном вопросе взяты из Ruby, где такое использование? а также! в конце имена методов, в случае необходимости, принимаются. Это принятие происходит от 1) легкодоступного в качестве символьных терминаторов в грамматике 2) использования? а также! в стандартной библиотеке. Однако следует отметить, что! не используется повсеместно для обозначения "побочного эффекта" и обычно присутствует только в альтернативных формах: сохранить / сохранить!, сортировать / отсортировать! и т. д. Существует огромное количество методов, которые выполняют побочные эффекты, которые не имеют! префикс.

Лично, если бы я разрабатывал язык, я бы позволил?,! и 'быть действительным без кавычек завершающих символов в именах символов. Несмотря на то, что некоторые языки допускают экранирование полного символа, например, Scala, таких символов обычно избегают, потому что очень неудобно заключать их в кавычки для использования.

// in Scala, esp. with Java-compat, the last form is generally used although
// the first two are perfectly valid -- do what makes sense in the language
foo.`empty?`
foo.empty_?
foo.isEmpty

Когда в Риме...

  • Scala - `пусто?` Или пусто_? (необычно)
  • C / C++ / JS / Java / Python / Perl - нет? или же! в идентификаторах; JS/Java позволяют $; $ является символом в Perl
  • C / C++ / Perl / JS - руки в воздухе?
  • C# - IsEmpty (метод или свойство) или Empty (свойство)
  • Python - is_empty или isEmpty для руководства Guido (хотя обычно протокол __len__: if not len(foo): "empty!")
  • Java - isEmpty для языкового руководства
  • Рубин - специальный трейлинг? а также! (Цитирую?)
  • JS - косвенный идентификатор доступа: obj["empty?"] (Не часто для этого)
  • "Лисп" (обычный): empty-p для предиката; вариации в чтении / цитировании

Рад видеть исправления и / или дополнения - это всего лишь капля в море.

Я не большой поклонник спецсимволов в именах функций, но потом я также буду биться до смерти, с помощью мокрого сельдерея, чтобы дразнить боль, любого, кого я нахожу, вставляя пробелы в имена файлов:-)

? Вариант так же легко сделать с чем-то вроде isEmpty() и ! вариант с sortInPlace(),

Английский - очень адаптивный язык, даже без знаков препинания.

В любом случае, мои языки по выбору (C и Java) используют знаки препинания для всех видов вещей. Наличие их в идентификаторах также сделало бы лексический анализ кошмаром.

Добавление "@" к имени метода (или любому идентификатору) в C# позволяет вам называть этот метод обычно зарезервированным ключевым словом.

void null() {}
// Invalid token 'null' in class, struct, or interface member declaration

void @null()
// compiles

Не делай этого; это в основном для машинно-сгенерированного кода, такого как наборы данных. Страница MSDN по теме.

Если вы считаете Javascript языком, многие фреймворки, похоже, используют символ "$" для обозначения "Селектор"; Например, можно использовать $("id-of-some-item") в Prototype.js или $("#id-of-some-item") в jQuery выбрать тег, который был написан <div id="id-of-some-item">, Использование этих функций выбора на самом деле довольно сложное и мощное (если вам интересно, ознакомьтесь с их сопроводительной документацией на prototypejs.org и jquery.com), но они сводятся к тому, чтобы делать то, что я считаю семантически похожим на то, что вы указано.

Опять же, это предполагает, что вы считаете Javascript языком.

Другие вопросы по тегам