scala: что такое метод внутреннего класса для динамического определения объема? - PullRequest
2 голосов
/ 19 мая 2011

Я пытаюсь оценить все 3 метода динамического определения объема, описанных здесь (https://wiki.scala -lang.org / display / SYGN / Dynamic-scope ), и я понимаю все, кроме метода внутреннего класса».это описывается следующим образом:

Можно добиться эффекта, аналогичного динамическому определению масштаба, используя определения вложенных классов.Определяя весь код потребления состояния как внутренние классы объекта состояния и создавая экземпляр этого объекта каждый раз, когда требуется новое глобальное состояние, весь содержащийся код получает прямой доступ к переменным состояния через родительскую ссылку.

Чтобы избежать определения всей программы в одном файле, этот подход для большинства целей требует использования компонентных миксинов для объединения программы в один класс.

Я не совсем понимаю это- Можно ли привести пример кода, показывающего это?Второй подход к неявным параметрам имеет смысл для меня, но в статье также предлагается, чтобы его можно было комбинировать с методом внутреннего класса, и я тоже не совсем это понимаю.Спасибо!

1 Ответ

2 голосов
/ 19 мая 2011

Например:

case class Board(rows: Int, columns: Int) {
    case class Pos(row: Int, column: Int) {
        require(0 <= row && row < rows && 0 <= column && column < columns)

        def neighbors = for {
            nRow <- Set(row - 1, row, row + 1)
            if 0 <= nRow && nRow < rows
            nColumn <- Set(column - 1, column, column + 1)
            if 0 <= nColumn && nColumn < columns
            if (nRow, nColumn) != (row, column)
        } yield Pos(nRow, nColumn)
    }
}

Здесь Pos относится к «контексту», который находится на Board: rows и columns.Например:

scala> val board = Board(5, 5)
board: Board = Board(5,5)

scala> val pos = board.Pos(0, 0)
pos: board.Pos = Pos(0,0)

scala> println(pos.neighbors)
Set(Pos(0,1), Pos(1,0), Pos(1,1))

Изменения в одном Board, как видно по Pos, связанному с этим экземпляром, но не с другими:

scala> val board2 = Board(2, 2)
board2: Board = Board(2,2)

scala> println(board.Pos(1,1).neighbors+"\n"+board2.Pos(1, 1).neighbors)
Set(Pos(1,0), Pos(1,2), Pos(2,0), Pos(2,1), Pos(0,0), Pos(2,2), Pos(0,1), Pos(0,2))
Set(Pos(0,0), Pos(0,1), Pos(1,0))
...