在 map 方法中调用匿名函数

Calling an anonymous function inside a map method

当我意识到我的 IDE 指出类型差异时,我正在制作一个具有多个可能参数的构造函数:

  case class PathAndColumns(path: String, column: Array[Column]) {

  def this(path: String, column: Column) {
    this(path, Array(column))
  }

  def this(path: String, column: String) {
    this(path, column.split(",").map( _ => col(_))) // : Array[String=>Column]
  }

所以我尝试只传递 col 函数。

  def this(path: String, column: String) {
    this(path, column.split(",").map(col)) // I work!
  }

它有效,然后,试图理解为什么,我最终得到:

  def this(path: String, column: String) {
    this(path, column.split(",").map(letsSee)) // I work as well
  }

  def letsSee(myStringCol: String): Column = {
    (() => col(myStringCol))() // A pair of extra parenthesis to simulate a call
  }

所以我发现将匿名函数传递给方法 map 不会 return 结果,而是整个函数(因为它被视为我想是对象)。

那么,如何让 this 工作以获得列而不是函数类型,而不单独声明它?

  def this(path: String, column: String) {
    this(path, column.split(",").map(_ => {
      col(_)
    }))
  }

您正在做的是将一个匿名函数传递给 map,返回另一个类型为 String => Column 的函数。您必须从函数文字的左侧部分删除占位符 _,或使用显式参数名称。

简单的答案是你替换

_ => col(_)

x => col(x)

问题是你正在对待 _ 是一个普通的变量标识符,但它不是。 _ 在第一个表达式中的两次使用是完全独立的。

第一个_是匿名函数参数的占位符。语法 _ => ... 表示您正在定义一个函数,但在计算结果时不会使用该函数的参数。

第二个 _col 参数的占位符。语法 col(_) 将方法 col 转换为自由函数。

中的两个下划线
.map(_ => col(_))

脱糖到

.map(x1 => x2 => col(x2))

而不是所需的

.map(x1 => col(x1))

另一方面,以下作品

.map(col)

由于 .