Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala func(_)和func之间的差异__Scala_Language Features - Fatal编程技术网

Scala func(_)和func之间的差异_

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

有人能告诉我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[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