あなたが本当に達成したいことだけを推測することはもちろんですが、具体的なURLに一致させるだけでなく、指定された文字列から情報を抽出したいと思っています。例えば。 "/foo/21"
が指定されている場合、これは"foo"/21
と一致することを知りたいだけでなく、値が21の何かをしたいと思っています。
リフトのURIマッチングプロセスが非常に有用であることがわかりましたあなたのユースケースに合っています。 (私はもちろん、非常に単純化されたバージョンを使用しています)リストを使って少し簡単にマッチングさせることができますが、の代わりに/
を使う必要があります。
しかし、それはポイントではありません。私が示したいのはないの利点はの暗黙的な変換の代わりにAsInt
抽出器を使用して、暗黙的な変換と抽出要するに
object AsInt {
def unapply(i: String): Option[Int] = try {
Some(i.toInt)
} catch {
case e: java.lang.NumberFormatException => None
}
}
def matchUrl(url: String) = {
val req:List[String] = url.split('/').toList.drop(1)
req match {
case "foo" :: "bar" :: Nil => println("bar")
case "foo" :: AsInt(i) :: Nil => println("The square is " + i*i)
case "foo" :: s :: Nil => println("No int")
case _ => println("fail")
}
}
matchUrl("/foo/21")
matchUrl("/foo/b")
matchUrl("/foo/bar")
matchUrl("/foobar")
// prints:
// The square is 441
// No int
// bar
// fail
の電源を使用していますInt
〜String
実際には文字列から整数値を取得することができます。明らかに、ネーミングが気に入らなければ、それをより控えめなものに変更することができますが、実際にURLのマッチングを行う場合は、暗黙的にすべてを変換しないでください。
あなたがこれを行うことができるかどうかを伝えるためのScalaエキスパートは十分ではありませんが、私はあなたにこれをしてはいけないと言います。 「Scala Puzzlers」などを構築しようとしているのでなければ、急激な割引で多くの問題を買っているだけです。 – Malvolio
いくつかの文脈を与えるために、私がしようとしているのはURLパターンを指定するURLマッチャーです。 "foo/bar"/34/"some/thing"。明らかに私はあなたや他の何かができましたが、 "foo/bar" \ 34 \ "some/thing"はちょっと変わっています。 /の使用法は、この文脈のコードの読者にとっては、はっきりしているべきだと思います。 –
コメントの例では、暗黙的な変換はInt –