2

同じタイプのネストされたマップを持つMap可能性がある があります。これらのネストされた各マップには、外側のマップへの参照があります。

現在のマップを調べるメソッドを定義しました。findValue何も見つからない場合はその親に移動しnull、最も外側の の親に到達するまで続けSymbolTableます。

と;Tryで一致させることができるように、この動作を に入れました。ただし、型が a-laになるのを避けるために、出力を平坦化します。SuccessFailureTry[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を取得するために完全に使用できますOptionOptionそれははるかに簡単になります:

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

parentScopeできる場合は、直接null戻って、それも防ぐ必要がありますNone

于 2016-05-10T11:39:02.040 に答える