代码之家  ›  专栏  ›  技术社区  ›  Jwan622

下划线与Scala中部分应用的函数中的占位符有何不同?

  •  2
  • Jwan622  · 技术社区  · 7 年前

    我一直在尽最大努力理解下划线语法,我发现了各种涉及此语法的线程,但我仍不清楚其中一种用法:

    我在奥德斯基的书中看到了这一点(第3版第150和151页)

    someNumbers.foreach(println _)
    

    显然,这将替换整个参数列表?我看不出这与普通占位符有何不同。它接着说,这不是单个参数的占位符。。。它是整个列表的占位符。我对此并不清楚。这与占位符有何不同?

    这是同一个概念吗:

    def add(x: Int, y: Int) = x + y
    val addFunction = add _
    // Does this just copy the parameter list?
    addFunction(1,2)
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Eaque    7 年前

    在里面 add _ println _ 下划线不是占位符。如果您更换 添加_ 具有 add(_) 在第二个示例中。在这种情况下,代码将不会编译。如果是占位符,可以切换语法。

    它被称为 eta扩展 用于将方法转换为函数。在Scala thoses中,两个概念略有不同:

    • A. 作用 可以使用以下语法定义: val fn: A => B = (a: A) => ...
    • A. 方法 使用以下语法定义: def fn(a: A): B = ...

    通常,这两种语法可以不加区别地使用。但有时需要使用这种语法将方法显式转换为函数。

    您可以在此处找到更多信息: What is the eta expansion in Scala?