столбец строки таблицы scala неявный - PullRequest
0 голосов
/ 10 марта 2019

Чтобы освоить implicits в scala, я попытался воспроизвести пример таблицы из выступления Мартина Одерского (во время 41:22): https://www.youtube.com/watch?v=YXDm3WHZT5g

Вот мойпопытка.Это работает, за исключением того факта, что я не могу избавиться от последствий thisTable и thisRow:

object Prog {

  class Table {
    private var rows: Seq[Row] = Seq()
    def add(row: Row) = rows = rows :+ row
    override def toString(): String = {
      s"Table(${rows.mkString(", ")})"
    }
  }
  class Row {
    private var columns: Seq[Column] = Seq()
    def add(col: Column) = columns = columns :+ col
    override def toString(): String = {
      s"Row(${columns.map(_.content).mkString(", ")})"
    }
  }
  case class Column(content: String)

  def table(initTable: Table => Unit): Table = {
    val t = new Table()
    initTable(t)
    t
  }
  def row(initRow: Row => Unit)(implicit table: Table): Row = {
    val r = new Row()
    initRow(r)
    table.add(r)
    r
  }
  def cell(content: String)(implicit row: Row) = {
    row.add(new Column((content)))
  }

  def main(args: Array[String]): Unit = {
    val t:Table =
      table { implicit thisTable => // How can I get rid of this "implicit thisTable"?
        row { implicit thisRow => // How can I get rid of this "implicit thisRow"?
          cell("cellA1")
          cell("cellB1")
        }
        row { implicit thisRow =>
          cell("cellA2")
          cell("cellB2")
        }
      }
    println(t)
  }
}

Как мне добиться синтаксиса компоновщика, как было показано вговорите?

Я пытался переместить ключевое слово implicit перед типами параметров в функциях table и row, но как только я это сделаю, компилятор начинает лаять на меня в несколькихместа («Неверный тип», «отсутствует тип параметра: таблица», «';' или ожидается перевод строки», ....)

Спасибо

1 Ответ

0 голосов
/ 10 марта 2019

Метод row ожидает implicit table.

def row(initRow: Row => Unit)(implicit table: Table): Row = {
    ...
  }

Так что либо вы предоставляете thisTable как implicit, как и ваше решение.

Или вы должны явно указать thisTable и thisRow, например:

val t:Table =
  table {  thisTable => // No implicit here
    row {  thisRow => // No implicit here
      cell("cellA1")(thisRow) // But explicitly row
      cell("cellB1")(thisRow) // But explicitly row
    }(thisTable) // But explicitly table
    row { implicit thisRow =>
      cell("cellA2")(thisRow)
      cell("cellB2")(thisRow)
    }(thisTable)
  }

Хороший пример того, сколько шаблонов вы можете избежать с помощью implicits.

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