为什么map.get有2个参数可能吗?

时间:2017-04-26 11:03:03

标签: scala

我有2张地图,(defun count12 (x) (if (or (null x) (null (cdr x))) 0 (if (and (= 1 (car x)) (= 2 (cadr x))) (+ 1 (count12 (cdr x))) (+ 0 (count12 (cdr x)))))) map1,都是map2类型。

我想要做的是,在第一张地图中搜索一个键,如果没有找到,则在第二张地图中搜索,如果仍未找到,则使用默认值:

Map[String, MyType]

然而,我意外写的是:

map1.getOrElse(name, map2.getOrElse(name, defVal))

令人惊讶的是,这并没有导致编译时错误(并返回map1.getOrElse(name, map2.get(name, defVal))),尽管我使用2个参数调用null

正如我在IDE(Eclipse)中看到的,它调用了get的{​​{1}},而不是get(x$1 : Any) : MyType的{​​{1}}

当我使用第二个参数调用java.util.Map时,为什么不报告错误?据我在文档中看到,get(key : String) : Option[MyType]只需要一个参数?它是否将这两个参数解释为元组或类似的东西(并将此元组用作scala.collection.MapLike - 参数)?

如果相关,map2.get是来自引用的map.get项目的类。

我在Scala中很安静,所以如果这是微不足道的或我错过的基本概念(每个编程scala应该已经知道),请告诉我要搜索的内容。

修改

正如我在评论中看到的那样,问题是不可重现的,我看到,我hava Any,因为我从我引用的Java项目中获取了集合。现在它也可以用这样的短代码重现:

MyType

2 个答案:

答案 0 :(得分:2)

可以从map2.get(name, defVal)map2.get((name, defVal))进行参数调整。

修改:使用JavaConverters。 {@ 1}}已被弃用。

答案 1 :(得分:0)

嗯......我不确定你是如何做这项工作的,这是不可能的。

它仍然不可行(至少对于Scala 2.12.1)

scala> val map1 = Map("1" -> "!", "2" -> "@")
map1: scala.collection.immutable.Map[String,String] = Map(1 -> !, 2 -> @)

scala> val map2 = Map("3" -> "#", "4" -> "$")
map2: scala.collection.immutable.Map[String,String] = Map(3 -> #, 4 -> $)

scala> val s = map1.getOrElse("3", map2.get("3", "%"))
<console>:13: error: too many arguments (2) for method get: (key: String)Option[String]
       val s = map1.getOrElse("3", map2.get("3", "%"))
                                                 ^