为什么人们使用_?作为标识符后缀?

时间:2010-12-04 15:31:31

标签: scala lift

我开始阅读Lift框架源代码,我发现使用像methodName_?之类的名称定义了很多方法,是否存在_?具有某些特殊含义的约定?

def empty_? : Boolean = {}

2 个答案:

答案 0 :(得分:26)

你不太可能在电梯框架之外看到这个结构;我怀疑它主要是Ruby嫉妒。

几乎任何其他Scala项目都会回避这种语法。不是因为尾随问号,而是因为它是将下划线引入代码的另一种方式 - 而且符号已经过度重载了。

根据对多个Scala项目的评估,该符号可以合理地描述为非惯用项。

<强>更新

需要下划线的原因是消除中缀符号的歧义,其中:

x?y

将被视为

x.?(y)

?是方法名称。鉴于:

x_?y

显然将x_?标记为原子。

语法是正式称为“混合标识符”的示例,旨在允许诸如

之类的定义。
def prop_=(v:String) = ... //setter
def unary_- = ... //prefix negation operator

当类似的构造仅仅用于在方法名称的末尾推一个问号时,它可以(可以说)被认为是一种黑客攻击。

答案 1 :(得分:24)

?表示这是一个谓词,一个返回Boolean的函数。这个约定可以追溯到Lisp,其中?(Scheme),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

确实