我正在阅读一本关于电梯的书,我遇到了一些我不太了解的事情: _ ::
object permanent_link extends MappedString(this, 150){
override def validations =
valMinLen(3, "Link URL must be at least 5 characters") _ ::
super.validations
}
我找不到任何提示,所以如果有人能帮助我,我将不胜感激。
答案 0 :(得分:18)
我不知道Lift,但这是一个普遍的问题。首先,::
是Scala cons运算符:
scala> 1 :: 2 :: List(3, 4)
res0: List[Int] = List(1, 2, 3, 4)
这意味着super.validations
是某种序列,valMinLen(3, "Link URL must be at least 5 characters") _
是该列表中的单个值。
从上下文来看,很明显,在重写的validations
方法中,他们调用super
版本和在开头添加一些额外的验证。
此额外验证是通过调用valMinLen()
创建的。但是,这个额外的调用不会返回与validations
列表类型匹配的元素 - 而是一个函数。我们明确地说(通过添加_
后缀`)我们想要在函数本身前面添加函数值,而不是前置函数值,而不是该函数的返回值。
代码段胜过千言万语:
scala> def f = 3
f: Int
scala> def g = 4
g: Int
scala> val listOfInts = List(f, g)
listOfInts: List[Int] = List(3, 4)
scala> val listOfFunctions = List(f _, g _)
listOfFunctions: List[() => Int] = List(<function0>, <function0>)
比较listOfInts
和listOfFunctions
的类型。我相信在Scala世界中f _
语法称为部分应用函数。
答案 1 :(得分:5)
下划线表示不调用valMinLen,而是用作函数“指针”。
::
运算符连接列表。
validations
,它由一个函数“指针”组成valMinLen
并给出了参数,列表的其余部分是{{ 1}},这是超类的验证。
我相信有人会在这里纠正我的术语:)
答案 2 :(得分:0)
使用适当的缩进并引入val:
,代码可能更具可读性object permanent_link extends MappedString(this, 150) {
override def validations = minimumValidation :: super.validations
val minimumValidation = valMinLen(3,"Link URL must be at least 5 characters") _
}
如前所述,::
运算符只是在列表中添加一个新元素,_
与它无关,用于获取函数对象,如
(1 :: 2 :: Nil) map (println _)
创建列表[1,2]并将函数println应用于每个元素(这里实际上可以省略下划线)。对象println _
从println
方法构造一个函数对象,_
表示函数的单个参数。