当前位置: 首页 > 知识库问答 >
问题:

反引用要么返回对象

滑乐逸
2023-03-14

我试图使用函数中的返回类型来返回对象或字符串。如果它是一个对象,我想开始从这个对象调用html" target="_blank">方法。如果它是一个字符串,我想在其他地方调用一些其他函数。我一直挂断电话,因为返回的对象不是我要返回的对象,它是“left”类型,我似乎无法将该对象从“left”类型恢复到我想要的“Player”类型。这包含在扩展可变队列的对象中。下面是我的函数,它根据ActionQueue对象中的键在地图中查找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)
  }
}

这是我的函数,它试图使用返回“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函数,它确实允许我调用par的决策函数并获取它返回的内容,但我想直接使用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个答案

许法
2023-03-14

区分大小写并同时提取内容的最佳方法是使用模式匹配。

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

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是更好的样式(粗略地说,它使一个只读变量)。

方增
2023-03-14

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

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

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

def getDecision(player: Player) = ....
def stringStuff(str: String) = ....
 类似资料:
  • 问题内容: 我们正在开发对延迟敏感的应用程序,并且已经对各种方法(使用jmh)进行了微基准测试。在对基准测试方法进行微基准测试并对结果满意之后,我实现了最终版本,但发现最终版本比我基准测试的 速度慢 了 3倍 。 罪魁祸首是所实现的方法正在返回一个对象而不是一个对象。这是基准代码的简化版本: 以上基准测试结果: 只需更改函数的返回类型,就可以将性能提高近三倍。 我认为返回枚举对象与整数之间的唯一区

  • 条款23: 必须返回一个对象时不要试图返回一个引用 据说爱因斯坦曾提出过这样的建议:尽可能地让事情简单,但不要过于简单。在c++语言中相似的说法应该是:尽可能地使程序高效,但不要过于高效。 一旦程序员抓住了“传值”在效率上的把柄(参见条款22),他们会变得十分极端,恨不得挖出每一个隐藏在程序中的传值操作。岂不知,在他们不懈地追求纯粹的“传引用”的过程中,他们会不可避免地犯另一个严重的错误:传递一个

  • 我正在编写一个自定义配置单元UDF来根据属性文件中定义的值解析映射中的键/值对。正在验证的格式(map ,String)。目的是让第一个参数是要计算的映射,第二个参数包含属性文件。 我遇到的问题是,GenericUDF类似乎希望这两个值对查询都是动态的,因为initialize()函数将参数转换为ObjectInspectors,从外观上看,这没有可能的选项来返回它们所检查的对象。 我希望init

  • 很多人都说不应该完全否定 Window,Windows 也有它的长处。不应该骂微软。 对。Windows 容易操作,适合普通用户。如果微软把它自己定位在 P&G,Philips 那样的地位,能够给我们的百姓提供周到的,完善的,价廉物美的服务。那我肯定是很喜欢它的。 但是从上面的种种情况说明,微软是一个野心极大的国际垄断组织!它的产品没有一个是不出问题的:Windows 不稳定,容易中病毒,而微软不

  • 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用 本条款听起来很复杂,其实不然。它只是一个很简单的道理,真的,相信我。 先看第一种情况:返回一个局部对象的引用。它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的。也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的。所谓生命空间,是指它们所在的函数体。当函数返回时,程序的控制离开了这个空

  • 本文向大家介绍PHP引用返回,包括了PHP引用返回的使用技巧和注意事项,需要的朋友参考一下 示例 有时,您有时需要隐式返回引用。 当您想使用函数查找引用应绑定到哪个变量时,按引用返回非常有用。不要使用引用返回来提高性能。引擎将自动自动对此进行优化。仅在有充分的技术理由时才返回引用。 取自PHP文档,供按引用返回。 通过引用返回可以采用许多不同的形式,包括以下示例: 通过引用返回不仅限于函数引用。您