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