Почему люди используют _? как суффикс идентификатора?
Я начинаю читать исходный код рамки Lift, я обнаружил, что существует так много методов, определяемых с использованием имени типа methodName_?
, существует ли соглашение, что _?
имеет какое-то особое значение?
def empty_? : Boolean = {}
Ответы
Ответ 1
?
означает, что это предикат, функция, возвращающая Boolean
. Это соглашение возвращается к Lisp, где ?
(Схема), p
или -p
(другие Lisps, имитирующие знак вопроса с помощью "аналогичной" буквы), также обозначают предикаты. Подумайте об этом, задав вопрос: "Объект пуст?"
Scala будет разрешать только имена смешанных идентификаторов (содержащие буквенно-цифровые символы и знаки препинания), если вы разделите их на _
. Например.
scala> def iszero?(x : Int) = x == 0
<console>:1: error: '=' expected but identifier found.
def iszero?(x : Int) = x == 0
^
не работает, но
scala> def iszero_?(x : Int) = x == 0
iszero_$qmark: (x: Int)Boolean
делает.
Ответ 2
Вы вряд ли увидите конструкцию вне рамки лифта; Я подозреваю, что это в основном зависть Руби.
Почти любой другой проект Scala будет уклоняться от этого синтаксиса. Не из-за трейлинг-вопросительного знака, а потому, что это еще один способ ввести символы подчеркивания в ваш код, - и символ уже слишком сильно перегружен.
Основываясь на оценке нескольких проектов Scala, нотация может быть разумно описана как неидиоматическая.
UPDATE
Причиной того, что подчеркивание требуется, является устранение неоднозначности из нотной записи, в которой:
x?y
будет считаться как
x.?(y)
с ?
, являющимся именем метода. Принимая во внимание:
x_?y
Ясно, что demarks x_?
является атомарным.
Синтаксис является примером того, что формально известно как "смешанный идентификатор" и предназначен для определения таких определений, как
def prop_=(v:String) = ... //setter
def unary_- = ... //prefix negation operator
Это можно (возможно) считать взломом, когда аналогичная конструкция используется просто для того, чтобы засунуть вопросительный знак в конце имени метода.