0

当我意识到我的 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这样的方法不会返回结果,而是返回整个函数(因为我想它被视为对象)。

那么,如何在不单独声明的情况下使这项工作成为 Column 而不是函数类型呢?

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

3 回答 3

4

简单的答案是你替换

_ => col(_)

x => col(x)

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

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

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

于 2019-09-20T12:45:52.387 回答
1

中的两个下划线

.map(_ => col(_))

脱糖

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

而不是想要的

.map(x1 => col(x1))

另一方面,以下工作

.map(col)

由于eta 扩展

于 2019-09-20T18:54:58.837 回答
0

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

于 2019-09-20T12:43:33.387 回答