【发布时间】:2010-12-04 15:31:30
【问题描述】:
我开始阅读 Lift 框架源代码,我发现有很多方法都使用像 methodName_? 这样的名称来定义,有没有约定 _? 有什么特殊含义?
def empty_? : Boolean = {}
【问题讨论】:
我开始阅读 Lift 框架源代码,我发现有很多方法都使用像 methodName_? 这样的名称来定义,有没有约定 _? 有什么特殊含义?
def empty_? : Boolean = {}
【问题讨论】:
您不太可能看到电梯框架之外的构造;我怀疑这主要是对 Ruby 的嫉妒。
几乎所有其他 Scala 项目都会回避这种语法。不是因为尾随的问号,而是因为它是在代码中引入下划线的另一种方式 - 符号已经严重超载。
基于对多个 Scala 项目的评估,该表示法可以合理地描述为非惯用语。
更新
需要下划线的原因是为了消除中缀符号的歧义,其中:
x?y
会读作
x.?(y)
? 是一个方法名。鉴于:
x_?y
清楚地将x_? 标记为原子。
语法是正式称为“混合标识符”的示例,旨在允许诸如
之类的定义def prop_=(v:String) = ... //setter
def unary_- = ... //prefix negation operator
当类似的结构被简单地用于在方法名称的末尾加上一个问号时,它可以(可以说)被认为是一种 hack。
【讨论】:
_! 后缀用于“危险”方法(例如open_! 上的Box)。一般来说,在 Scala 中习惯性地不鼓励混合的 alpha-symbolic 标识符,除了 mutators 上的 _=。除了原始属性,您应该使用 Java 约定而不是 _?,而不是 is...,它应该只是属性名称(例如 visible,而不是 isVisible)。
? 表示这是一个谓词,一个返回 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
会。
【讨论】: