我试图从我的函数中使用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)
答案 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
是更好的风格(粗略地说,它是一个只读变量)。