我有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
答案 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", "%"))
^