任何人都可以告诉我Scala中func _和func(_)之间的区别?我不得不重写这个方法:
def validations: List[ValueType => List[FieldError]] = Nil
如果我用:
覆盖它val email = new EmailField(this, 255){
override def validations = valUnique _ :: Nil
private def valUnique(email: String): List[FieldError] = {
Nil
}
}
没关系,如果我用:
覆盖它val email = new EmailField(this, 255){
override def validations = valUnique(_) :: Nil
private def valUnique(email: String): List[FieldError] = {
Nil
}
}
不行。任何人都可以解释原因吗?非常感谢你。
答案 0 :(得分:8)
以下情况:
valUnique _
您部分应用 valUnique
方法,导致它被装箱为函数。
另一方面:
valUnique(_)
指定调用valUnique
方法的占位符,通常这样做是为了将匿名函数传递给其他高阶函数,如:
emails flatMap { valUnique(_) }
在您的情况下,虽然部分申请仍然完全有效,但范围内没有任何内容可用于实现此类占位符。
请注意,在将方法作为参数传递之前,您还可以将方法提升为函数:
emails flatMap { valUnique _ }
这种相似性几乎可以肯定是你混淆的原因,尽管这两种形式并没有在幕后做完全同样的事情。
答案 1 :(得分:4)
如果你这样写:
override def validations: List[ValueType => List[FieldError]] = valUnique(_) :: Nil
我确信它会告诉你,你得到String => List[List[FieldError]]
而不是所需的类型。当使用下划线代替参数(而不是表达式的一部分)时,它将作为直接外部范围中的函数进行扩展。具体地,
valUnique(_) :: Nil // is translated into
x => valUnique(x) :: Nil
(valUnique(_)) :: Nil // would be translated into
(x => valUnique(x)) :: Nil // which would be correct
另一方面,valUnique _
只是说“获取此方法并将其转换为函数”,所以
valUnique _ :: Nil // gets translated into
(x => valUnique(x)) :: Nil