Почему люди используют _? как суффикс идентификатора?

Я начинаю читать исходный код рамки 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

Это можно (возможно) считать взломом, когда аналогичная конструкция используется просто для того, чтобы засунуть вопросительный знак в конце имени метода.