Использование специальных символов в именах функций
В 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 языком.