scala:动态范围的内部类方法是什么?

时间:2011-05-19 02:40:11

标签: scala dynamic-scope

我正在尝试评估这里描述的所有3种动态作用域方法(https://wiki.scala-lang.org/display/SYGN/Dynamic-scope),我理解除“内部类方法”之外的所有方法。它描述如下:

  

使用嵌套类定义可以实现与动态作用域类似的效果。通过将整个状态消耗代码定义为状态对象的内部类,并在每次需要新的全局状态时实例化该对象,所有包含的代码都可以通过父引用直接访问状态变量。

     

为了避免在单个文件中定义整个程序,这种方法在大多数情况下都要求使用组件mixin将程序组合成一个类。

我不太明白这一点 - 有人可能会给出一些示例代码吗?隐式参数的第二种方法对我来说很有意义,但文章还建议它可以与内部类方法结合使用,我也不太明白。谢谢!

1 个答案:

答案 0 :(得分: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指的是Board上的“上下文”:rowscolumns。例如:

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))