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方法中引用它。