在 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)
由于 .
当我意识到我的 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)
由于