Je ne peux bien sûr que deviner ce que vous voulez vraiment accomplir, mais je suppose que vous ne voulez pas seulement faire correspondre des URL concrètes mais aussi extraire des informations de chaînes données. Par exemple. Quand on vous donne "/foo/21"
vous ne voulez pas simplement savoir que cela correspond à "foo"/21
mais vous voulez faire quelque chose avec la valeur de 21.
J'ai trouvé le processus de correspondance URI dans Lift pour être très utile, alors peut-être que correspond à votre cas d'utilisation. (J'utilise une version très simplifiée, bien sûr.) C'est fait avec les listes là-bas ce qui rend la correspondance un peu plus facile mais cela signifie aussi que vous devrez utiliser ::
au lieu de /
.
Mais ce n'est pas le point: ce que je veux montrer est l'avantage de pas en utilisant les conversions implicites et la puissance des extracteurs
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
En bref, en utilisant le lieu extracteur AsInt
d'une conversion implicite de Int
à String
vous pouvez réellement récupérer la valeur entière de la chaîne si et seulement si elle est convertible et bien sûr l'utiliser immédiatement. Évidemment, si vous n'aimez pas le nommage, vous pouvez le changer pour quelque chose de plus discret, mais si vous voulez vraiment faire correspondre l'url, vous ne devriez peut-être pas tout convertir implicitement.
Pas assez d'un expert Scala pour vous dire si vous pouvez le faire, mais je peux vous dire que ce ne devrait pas faire cela. Sauf si vous essayez de construire "Scala Puzzlers" ou quelque chose, vous achetez juste beaucoup d'ennuis à un escompte abrupt. – Malvolio
Pour donner un peu de contexte, ce que j'essaye de faire est d'écrire un comparateur d'URL où vous pouvez spécifier des modèles d'URL sous la forme de p. "foo/bar"/34/"quelque chose/chose". Évidemment, je pourrais vous \ ou toute autre chose, mais "foo/bar" \ 34 \ "quelque chose /" semble un peu bizarre. Je pense que l'utilisation de/devrait être très claire pour tout lecteur du code dans ce contexte. –
Notez que dans votre exemple de commentaire, la conversion implicite serait String to Foo, pas Int –