【问题标题】:Difference between func(_) and func _func(_) 和 func _ 之间的区别
【发布时间】:2011-02-21 09:58:29
【问题描述】:

谁能告诉我 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
  }
}

这不好。任何人都可以解释为什么?非常感谢。

【问题讨论】:

    标签: scala language-features


    【解决方案1】:

    如果是:

    valUnique _
    

    您正在部分应用valUnique 方法,导致它被装箱为函数。

    另一方面:

    valUnique(_)
    

    为调用valUnique 方法指定一个占位符,这通常是为了将匿名函数传递给其他一些高阶函数,如下所示:

    emails flatMap { valUnique(_) }
    

    在您的情况下,范围内没有任何内容可用于满足此类占位符,尽管部分应用程序仍然完全有效。

    请注意,您也可以在将方法作为参数传递之前将其提升为函数:

    emails flatMap { valUnique _ }
    

    这种相似性几乎可以肯定是造成您困惑的原因,尽管这两种形式在幕后完全做同样的事情。

    【讨论】:

      【解决方案2】:

      如果你这样写:

      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
      

      【讨论】:

        猜你喜欢
        • 2011-02-09
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 2018-06-30
        • 2019-01-03
        • 2020-04-14
        • 2018-05-01
        • 1970-01-01
        相关资源
        最近更新 更多