Вызов анонимной функции внутри метода карты

Я создавал конструктор с несколькими возможными аргументами, когда понял, что моя 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. Вам необходимо удалить заполнитель _ из левой части функционального литерала или использовать явное имя аргумента.

Другие вопросы по тегам