Как неявное преобразование срабатывает в примере из "Программирование в Scala"? - PullRequest
1 голос
/ 19 мая 2011

In Программирование в Scala 7.8 Рефакторинг кода императивного стиля :

// Returns a row as a sequence
def makeRowSeq(row: Int) =
  for (col <- 1 to 10) yield {
    val prod = (row * col).toString
    val padding = " " * (4 - prod.length)
    padding + prod
  }
// Returns a row as a string
def makeRow(row: Int) = makeRowSeq(row).mkString
// Returns table as a string with one row per line
def multiTable() = {
  val tableSeq = // a sequence of row strings
    for (row <- 1 to 10)
    yield makeRow(row)
  tableSeq.mkString("\n")
}

Похоже, что yield makeRow(row) каким-то образом использует версию makeRowSeq «Возвращает строку как строку». Как это происходит?

1 Ответ

1 голос
/ 19 мая 2011

Дело в том, что возврат из makeRowSeq вычисляется перед вызовом mkString, так что вызов makeRow фактически возвращает одну строку. То есть он использует метод Sek mkString вместо применения функции к каждому отдельному элементу последовательности. Для этого вам понадобится вызов функции карты.

...