【问题标题】:Why do people use _? as an identifier suffix?为什么人们使用_?作为标识符后缀?
【发布时间】:2010-12-04 15:31:30
【问题描述】:

我开始阅读 Lift 框架源代码,我发现有很多方法都使用像 methodName_? 这样的名称来定义,有没有约定 _? 有什么特殊含义?

def empty_? : Boolean = {}

【问题讨论】:

标签: scala lift


【解决方案1】:

您不太可能看到电梯框架之外的构造;我怀疑这主要是对 Ruby 的嫉妒。

几乎所有其他 Scala 项目都会回避这种语法。不是因为尾随的问号,而是因为它是在代码中引入下划线的另一种方式 - 符号已经严重超载。

基于对多个 Scala 项目的评估,该表示法可以合理地描述为非惯用语。

更新

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

x?y

会读作

x.?(y)

? 是一个方法名。鉴于:

x_?y

清楚地将x_? 标记为原子。

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

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

当类似的结构被简单地用于在方法名称的末尾加上一个问号时,它可以(可以说)被认为是一种 hack。

【讨论】:

  • "符号已经严重超载" 作为一个单独的标记,当然,但不在标识符内部。
  • @Alexey Romanov:这仍然违反了在标识符中使用 CamelCase 和 dromedaryCase 的 Scala 约定。
  • @larsmans 这与一开始就允许复合标识符进入 Scala 的全部原因背道而驰!
  • 对此答案的主要+1。我打算发布类似的东西,但你打败了我。一般来说,Lift(和相关模块)是唯一使用这种约定的 Scala 框架。它还将_! 后缀用于“危险”方法(例如open_! 上的Box)。一般来说,在 Scala 中习惯性地不鼓励混合的 alpha-symbolic 标识符,除了 mutators 上的 _=。除了原始属性,您应该使用 Java 约定而不是 _?,而不是 is...,它应该只是属性名称(例如 visible,而不是 isVisible)。
  • 最好明确说明“没有与method_相关的糖?与method_="相反。
【解决方案2】:

? 表示这是一个谓词,一个返回 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

会。

【讨论】:

  • 阅读问题太快了。我已经删除了我的并投了这个票。
  • 顺便说一句。这在 Scala 中没有意义 - docs.scala-lang.org/style/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多