Scala func(_)和func之间的差异_
有人能告诉我Scala中func_u和func(u)的区别吗?我必须重写此方法:Scala func(_)和func之间的差异_,scala,language-features,Scala,Language Features,有人能告诉我Scala中func_u和func(u)的区别吗?我必须重写此方法: def validations: List[ValueType => List[FieldError]] = Nil 如果我将其覆盖为: val email = new EmailField(this, 255){ override def validations = valUnique _ :: Nil private def valUnique(email: String): List[Fiel
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
}
}
这是正常的,但如果我用以下内容覆盖它:
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
}
}
这不好。谁能告诉我为什么?非常感谢。对于以下情况:
valUnique _
您正在部分应用valUnique
方法,导致将其作为函数装箱
另一方面:
valUnique(_)
为调用valUnique
方法指定占位符,通常这样做是为了将匿名函数传递给其他高阶函数,如:
emails flatMap { valUnique(_) }
在您的例子中,虽然部分应用程序仍然完全有效,但范围中并没有任何内容可以用来实现这样的占位符
请注意,在将方法作为参数传递之前,还可以将其提升到函数:
emails flatMap { valUnique _ }
这种相似性几乎肯定是你困惑的原因,即使这两种形式在幕后做的事情并不完全相同。如果你这样写:
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