Вызов анонимной функции внутри метода карты - PullRequest
0 голосов
/ 20 сентября 2019

Я делал конструктор с несколькими возможными аргументами, когда понял, что моя среда 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 ]

4 голосов
/ 20 сентября 2019

Простой ответ заключается в том, что вы заменяете

_ => col(_)

на

x => col(x)

Проблема в том, что вы обрабатываете _ - это обычный идентификатор переменной, но это не так,Два использования _ в первом выражении полностью независимы.

Первое _ является заполнителем для аргумента анонимной функции.Синтаксис _ => ... означает, что вы определяете функцию, но не будете использовать аргумент этой функции при вычислении результата.

Второй _ является заполнителем для аргумента col.Синтаксис col(_) превращает метод col в свободную функцию.

1 голос
/ 20 сентября 2019

Два подчеркивания в

.map(_ => col(_))

десугар до

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

вместо желаемого

.map(x1 => col(x1))

С другой стороны, следующие работы

.map(col)

из-за Эта-расширение .

0 голосов
/ 20 сентября 2019

То, что вы делаете, передаете на отображение анонимной функции, возвращающей другую функцию с типом String => Column.Вы должны удалить заполнитель _ из левой части литерала функции или использовать явное имя аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...