Чтобы освоить 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
, но как только я это сделаю, компилятор начинает лаять на меня в несколькихместа («Неверный тип», «отсутствует тип параметра: таблица», «';' или ожидается перевод строки», ....)
Спасибо