我正在阅读一本关于电梯的书,我遇到了一些我不太了解的东西: _ ::
object permanent_link extends MappedString(this, 150){
override def validations =
valMinLen(3, "Link URL must be at least 5 characters") _ ::
super.validations
}
Run Code Online (Sandbox Code Playgroud)
我找不到任何提示,所以如果有人能帮助我,我将不胜感激.
Tom*_*icz 18
我不知道Lift,但这是一个普遍的问题.首先,这::是一个Scala cons运算符:
scala> 1 :: 2 :: List(3, 4)
res0: List[Int] = List(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
这意味着它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>)
Run Code Online (Sandbox Code Playgroud)
比较的类型listOfInts和listOfFunctions.我相信f _语法在Scala世界中称为部分应用函数.
下划线表示不调用valMinLen,而是用作函数"指针".
该::运算符连接列表.
换句话说,它似乎是代码构建一个列表validations,该列表由一个函数"指针" valMinLen和给定的参数组成,列表的其余部分是值super.validations,即超类的验证.
我相信有人会在这里纠正我的术语:)