Scala 传递状态,而不使隐式代码混乱
我的层次结构如下所示:Scala 传递状态,而不使隐式代码混乱,scala,immutability,implicit,Scala,Immutability,Implicit,我的层次结构如下所示: trait Player trait Player1 extends Player trait Player2 extends Player trait Human extends Player trait Computer extends Player 我有一个函数文本,它将用户输入映射到类型Players的实例,其中type Players=Tuple2[Player1,Player2]: val initialize: Array[String] => Pl
trait Player
trait Player1 extends Player
trait Player2 extends Player
trait Human extends Player
trait Computer extends Player
我有一个函数文本,它将用户输入映射到类型Players的实例,其中type Players=Tuple2[Player1,Player2]
:
val initialize: Array[String] => Players = (args: Array[String]) =>
args.map(_.trim.toLowerCase) match {
case Array("x") =>
(new Player1 with Human, new Player2 with Computer)
case Array("o") =>
(new Player1 with Computer, new Player2 with Human)
case _ =>
(new Player1 with Human, new Player2 with Computer)
}
有没有一种方法可以让我的其他类知道玩家
,而不必把玩家隐式传给其他类?e、 g
def nextPlayer(player: Player)(implicit players: Players): Player =
player match {
case _: Player1 => players._2
case _: Player2 => players._1
}
我希望尽可能避免副作用,所以我没有使用过类似于:
object GameState {
var player1: Player = _
var player2: Player = _
}
但是,这是唯一一种将
玩家
传递给所有需要它的方法的方法吗?将单个玩家嵌入玩家
类中:
class Players(init: Array[String]) { players =>
trait Player
...
val (p1, p2) = init.map(_.trim.toLowerCase match {
case Array("x") => (new Player1 with Human, new Player2 with Human)
...
}
def nextPlayer(player: Player): Player = if (player eq p1) p2 else p1
...
}
我在玩家和其他需要访问它的类之间有一些耦合。例如,使用您的方法,我仍然需要实例化该类并将其传递给我的AI模块。@SamuelHeaney-显式通常是一件好事——如果您有多个玩家,您确实想知道您正在使用哪些玩家。如果你永远不会,你可以在玩家中嵌入AI,或者让玩家成为AI类的构造函数参数,这样你就可以从AI方法中引用它。