取消引用返回对象

时间:2017-03-14 21:10:44

标签: scala either

我试图从我的函数中使用Either返回类型来获取对象或字符串。在它是一个对象的情况下,我想开始从这个对象中调用方法。在它是一个字符串的情况下,我想在其他地方调用其他一些函数。我一直挂断电话,因为被退回的东西不是我回来的对象,它的类型是#34;左边"我似乎无法将这个对象从" Left"键入" Player"我喜欢I型。这包含在扩展可变队列的对象中。这是我的函数,它根据我的ActionQueue对象中的键在Map中查找Player对象:

def popCurrentAction : Either[Player, String] = {
  val currentAction = this.dequeue
  this.enqueue(currentAction)

  if (playerMap.get(currentAction) != None) {
    Left((playerMap.get(currentAction).get))
  }
  else {
    Right(currentAction)
  }
}

这是我的函数,它试图使用返回A" Player"对象或字符串。

def doMove = {
  var currentAction = ActionQueue.popCurrentAction
  if (currentAction.isLeft) {
    var currentPlayer = currentAction.left
    var playerDecision = currentPlayer.solicitDecision() // This doesn't work

    println(playerDecision)

  }
  else {
    // Do the stuff if what's returned is a string.
  }
}

我尝试使用.fold函数,它允许我调用solicitDecision函数并获取它返回的内容,但我想直接使用Player对象。当然这是可能的。有人可以帮忙吗?

  var currentPlayer = currentAction
  var playerDecision = currentPlayer.fold(_.solicitDecision(), _.toString())
  // This is close but doesn't give me the object I'm trying to get!
  println(playerDecision)

2 个答案:

答案 0 :(得分:2)

你还没有说明你得到的错误,只是“这不起作用”,你发布的代码不够完整,无法编译和测试。当编译器失败时,currentPlayer类型是什么?

话虽如此,您可以考虑重构代码。

def doMove = ActionQueue.popCurrentAction.fold(getDecision, stringStuff)

def getDecision(player: Player) = ....
def stringStuff(str: String) = ....

答案 1 :(得分:2)

进行大小写区分和同时提取事物的最佳方法是使用模式匹配。

在您的情况下,这大致是以下代码:

def doMove = {
  val currentAction = ActionQueue.popCurrentAction
  currentAction match {
    case Left(currentPlayer) => 
      val playerDecision = currentPlayer.solicitDecision()
      println(playerDecision)
    case Right(string) =>
      println(string)
  }
}

另请注意,我使用val代替var。当你有一个你不打算改变的变量时,val是更好的风格(粗略地说,它是一个只读变量)。