以_结尾的方法! Scala有特殊意义吗?

时间:2010-06-22 19:39:23

标签: scala naming-conventions

_!结尾的方法(例如delete_!i_is_!)是否具有特殊含义?他们只是“名字”吗?他们遵循一些惯例吗?甚至有bulkDelete_!!。 (如果有所不同,具体情况就是提升。)

3 个答案:

答案 0 :(得分:17)

我不确定在Lift中使用_!_!!的惯例是什么,但这里有一些背景知识。

任何字母数字标识符都可以包含_和添加的符号列表,并且仍然可以解析为单个标识符。例如:

scala> class Example_!@%*!
defined class Example_$bang$at$percent$times$bang

(事实上,如果用反引号包围它,你几乎可以将任何东西解析为标识符 - 例如,如果Java类使用Scala保留字,那么这就是你所做的。或者如果你想在标识符中使用空格。)

然而,编译器只能识别一个符号结尾。如果有一个看起来像getter的方法,那么getter_ =将被解释为setter。 (无论你实际上使用它作为一个setter都取决于你;无论如何它都将具有setter的语义。)所以

scala> class Q { def q = "Hi"; def q_=(s: String) { println(s.reverse) } }
defined class Q

scala> val q = new Q
q: Q = Q@b5c12e

scala> q.q
res0: java.lang.String = Hi

scala> q.q = "Could use this to set something"
gnihtemos tes ot siht esu dluoC

此外,编译器在:结尾的任何方法中反转调用者和被调用者的顺序。这通常出现在列表中:newElement :: existingList实际上是对existingList.::(newElement)的调用。所以,例如:

scala> object Caps { def to_:(s: String) = s.toUpperCase }
defined module Caps

scala> "Example" to_: Caps
res40: java.lang.String = EXAMPLE

_ +符号的任何其他用法都是惯例。

答案 1 :(得分:8)

没有特别的意义!在斯卡拉的名字。在基于Lisp的语言系列中,!通常用于表示函数具有副作用,这看起来像是惯例。

答案 2 :(得分:6)

到目前为止奇怪的未提及(虽然与你的问题不是特别相关)是unary_!这是特别对待的。

scala> class A { def unary_! = 5 }
defined class A

scala> !(new A)
res0: Int = 5