2

ここ( https://wiki.scala-lang.org/display/SYGN/Dynamic-scope )で説明されている動的スコープの3つのメソッドすべてを評価しようとしていますが、「内部クラスのメソッド」以外はすべて理解しています。それは次のように説明されています:

ネストされたクラス定義を使用して、動的スコープと同様の効果を実現できます。状態を消費するコード全体を状態オブジェクトの内部クラスとして定義し、新しいグローバル状態が必要になるたびにそのオブジェクトをインスタンス化することにより、含まれるすべてのコードが親参照を介して状態変数に直接アクセスします。

プログラム全体を単一のファイルで定義することを避けるために、このアプローチでは、ほとんどの目的で、プログラムを単一のクラスに構成するためにコンポーネントミックスインを使用する必要があります。

私はこれを完全には理解していません-誰かがこれを示すいくつかのサンプルコードを与えることは可能ですか?暗黙的なパラメーターの2番目のアプローチは私には理にかなっていますが、この記事では、内部クラスのメソッドと組み合わせることができることも示唆されており、それもよくわかりません。ありがとう!

4

1 に答える 1

2

このような:

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にある「コンテキスト」を指します。例えば:Boardrowscolumns

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のインスタンスでは見られない1 つの変更: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))
于 2011-05-19T18:54:54.917 に答える