gpt4 book ai didi

方法参数中的 Scala 映射无法添加键值

转载 作者:行者123 更新时间:2023-12-02 20:55:41 25 4
gpt4 key购买 nike

在 Scala 中,如何将映射作为引用对象传递给方法,以便我可以将键值添加到该映射。我试过这段代码,它不起作用。

var rtnMap = Map[Int, String]()
def getUserInputs(rtnMap: Map[Int, String]) {
rtnMap += (1-> "ss") //wrong here
}

我知道,默认情况下,方法中的参数是val,就像java中的final一样,它可以提供一些安全性。但至少它应该允许我们插入一个新条目。你有什么想法吗?

最佳答案

欢迎使用函数式编程

首先,您的用例可以通过 mutable map 实现。您使用了 immutable map 因为它在 Scala 中默认可用。 scala.Predef 包中的所有内容在 Scala 中默认可用,默认情况下您不需要导入它。

以下代码正常运行。

import scala.collection.mutable.Map

val gMap = Map[Int, String]()

def getUserInputs(lMap: Map[Int, String]) = {
lMap += (1-> "ss")
}

下面的调用会改变gMap

的内容
getUserInputs(gMap)

这是证明

scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map

scala>
| val gMap = Map[Int, String]()
gMap: scala.collection.mutable.Map[Int,String] = Map()

scala>
| def getUserInputs(lMap: Map[Int, String]) = {
| lMap += (1-> "ss")
| }
getUserInputs: (lMap: scala.collection.mutable.Map[Int,String])scala.collection.mutable.Map[Int,String]

scala> getUserInputs(gMap)
res2: scala.collection.mutable.Map[Int,String] = Map(1 -> ss)

scala> gMap
res3: scala.collection.mutable.Map[Int,String] = Map(1 -> ss)

在最后一个 Scala repl 中,请注意 gMap 的内容。 gMap 包含添加的项目。

常规代码改进

除非有充分的理由,否则不要使用可变集合。

在不可变集合的情况下,当完成更改现有数据结构的操作时,将返回新实例。这样现有的数据结构不会改变。这在很多方面都是好的。这确保了程序的正确性,还确保了称为引用透明性的东西(阅读相关内容)。

所以你的程序理想情况下应该是这样的

val gMap = Map.empty[String, String] //Map[String, String]()

def getUserInputs(lMap: Map[Int, String]) = {
lMap += (1-> "ss")
}

val newMap = getUserInputs(gMap)

内容被添加到 newMap 中,旧 map 没有改变,保持原样。这是非常有用的,因为持有 gMap 和访问 gMap 的代码不需要担心底层结构发生的变化。(假设在多线程中场景,非常有用。)

Keeping the original structure intact and creating the new instance for changed state is the general way of dealing with state in functional programming. So its important to understand this and practice this.

已弃用的语法并在 Scala 2.12 中将其删除

你像下面这样声明了你的函数

def getUserInputs(lMap: Map[Int, String]) { // no = here
lMap += (1-> "ss")
}

在上面的函数定义中,右括号后没有=。这在 Scala 2.12 中已弃用。所以不要使用它,因为 Scala 编译器会使用这种函数声明语法给出误导性的编译错误。

正确的做法是这样的。

def getUserInputs(lMap: Map[Int, String]) = { 
lMap += (1-> "ss")
}

注意此语法中有 =

关于方法参数中的 Scala 映射无法添加键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com