2017-09-29 9 views
-3

私はScalaを学んでいます。Scalaコードの理解

誰でも下記のコードを説明してください。 私は理解しようとしていますが、...

def resolveDollarVar(sqlStr: String, vars: Map[String, String]): String = { 
    val varPattern = new scala.util.matching.Regex("""(\$\{(\S+?)\})""", "fullVar", "value") 
    varPattern replaceAllIn (sqlStr, m => { 
    try { 
     vars(m.group("value")) 
    } 
    catch { 
     case e: NoSuchElementException => throw new NoSuchElementException("Error: " + m.group("fullVar") + " cannot be resolved") 
    } 
    }) 
} 
+0

具体的に何が問題になっているのかを教えてください – puhlen

+0

「m」という単語とvars(m.group( "value"))は何ですか?私はvarsがマップ変数であることを知っています、この関数は何ですか? "m.group(" value ")"は地図上で実行可能ですか? – Jee

+0

'm'はマッチデータオブジェクトです、' value'は '(\ S +? ) '、それはマップから対応する値を取得するためのキーとして使用されます –

答えて

1

することはできませんthe relevant scaladoc pageへの迅速な訪問は、次のことを明らかに:

def replaceAllIn(target: CharSequence, replacer: (Match) ⇒ String): String

は代用機能を使用してすべての一致を置き換えます。 replacer関数 はscala.util.matching.Regex.Matchをとり、余分な情報が一致から得られる になるようにします。例えば:置換文字列に

import scala.util.matching.Regex 
val datePattern = new Regex("""(\d\d\d\d)-(\d\d)-(\d\d)""", "year", "month", "day") 
val text = "From 2011-07-15 to 2011-07-17" 
val repl = datePattern replaceAllIn (text, m => s"${m group "month"}/${m group "day"}") 

、数字が続くドル記号($)は は数〜9 1と、マッチしたパターンのグループへの参照として解釈されます最初の9つのグループに対応し、0は全体の一致を表します。他の文字はエラーです。バックスラッシュ(\)文字 はエスケープ文字として解釈され、ドル記号 をエスケープするために使用できます。これらの文字をエスケープするには、Regex.quoteReplacementを使用します。

のでmreplacerラムダに渡さMatchです。 group()は、Matchパラメータから名前付きグループを取得する方法です。 "value"は、正規表現パターンで2つのキャプチャグループのいずれかに割り当てられたラベルです。したがって

  1. 使用正規表現の入力sqlStrを解析します。関心のある部分文字列をキャプチャし、 "value"というラベルを付けます。
  2. "value"というラベルの文字列を取得し、varsマップのインデックスに使用します。
  3. replaceAllInは、「value」というラベルの付いた部分文字列をvarsマップから取得した文字列に置き換えます。