Вызов анонимной функции внутри метода карты
Я создавал конструктор с несколькими возможными аргументами, когда понял, что моя 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, возвращает не результат, а, скорее, всю функцию (потому что она, как я полагаю, рассматривается как объект).
Итак, как мне сделать эту работу, чтобы получить столбец, а не тип функции, не объявляя его отдельно?
def this(path: String, column: String) {
this(path, column.split(",").map(_ => {
col(_)
}))
}
3 ответа
Простой ответ - заменить
_ => col(_)
с
x => col(x)
Проблема в том, что вы лечите _
- это обычный идентификатор переменной, но это не так. Два использования_
в первом выражении полностью независимы.
Первый _
является заполнителем для аргумента анонимной функции. Синтаксис_ => ...
означает, что вы определяете функцию, но не будете использовать аргумент этой функции при вычислении результата.
Секунда _
является заполнителем для аргумента col
. Синтаксисcol(_)
поворачивает метод col
в бесплатную функцию.
Два подчеркивания в
.map(_ => col(_))
десахар для
.map(x1 => x2 => col(x2))
вместо желаемого
.map(x1 => col(x1))
С другой стороны, следующие работы
.map(col)
из-за эта-расширения.
То, что вы делаете, - это переход к отображению анонимной функции, возвращающей другую функцию с типом String => Column. Вам необходимо удалить заполнитель _ из левой части функционального литерала или использовать явное имя аргумента.