2

我有一个Map可能拥有相同类型的嵌套地图。这些嵌套地图中的每一个都有对外部地图的引用。

我已经定义了一个findValue查看当前地图的方法,如果它没有找到任何东西,它会转到它的父级,依此类推,直到到达null最外层的父级SymbolTable

我已将此行为放入 aTry中,以便我可以匹配Successand Failure; 但是,为了避免出现 a-la 类型,Try[Try[Try[ ... Try[TableVaue]... ]]]我将输出变平。

在尝试打电话时flatten,我收到以下错误:Cannot prove that Object <:< Try[U]

以下是相关的代码:

class SymbolTable(val parentScope: SymbolTable) {
  type TableValue = (TypeInfo, Option[Expression], Option[SymbolTable])

  private val contents: mutable.Map[String, TableValue] = mutable.Map.empty

  private def findValue(key: String): Try[TableValue] = Try {
    if (contents contains key) contents(key)
    else parentScope findValue key
  }.flatten
}

所以我的问题是:如何在不对代码进行任何重大重构的情况下完成这项工作?

4

1 回答 1

5
if (contents contains key) contents(key)
else parentScope findValue key

该表达式的类型是TableValue(的结果contents.apply)和Try[TableValue](的结果)的LUB findValue,即AnyRef(或java.lang.Object)。

以下可能会起作用:

if (contents contains key) Try(contents(key))
else parentScope findValue key

但整个表情并不好。Try仅当您无法避免必须捕获此处不是这种情况的异常时才有用。您可以完美地使用Map#get来检索Option. 有了Option它就变得简单多了:

def findValue(key: String): Option[TableValue] =
  contents.get(key).orElse(parentScope.findValue(key))

如果parentScope可以的null话你也得提防那个,None直接返回。

于 2016-05-10T11:39:02.040 回答