func(_)和func _之间的区别

时间:2011-02-21 09:58:29

标签: scala language-features

任何人都可以告诉我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
  }
}

不行。任何人都可以解释原因吗?非常感谢你。

2 个答案:

答案 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