One of the things that I don't like about extractors is that they cannot have parameters. Therefore, I cannot have type extractors Paramin:
req match { case Param("foo")(foo) => … }
Dynamic extractors?
This is unfortunate, and I hope that it will change someday, but this morning I decided that I could fix it using a dynamic symptom.
object Params extends Dynamic {
def selectDynamic(name: String) = new {
def unapply(params: Map[String, String]): Option[String] = params.get(name)
}
}
... hoping this will allow me to use Params in the pattern matching statement as follows:
req match { case Params.Foo(value) =>
// matching Map("Foo" -> "Bar"), extracting "Bar" in value
He does not work
... but it does not work. The compiler seems to be still confused.
scala> Map("Foo" -> "bar") match { case Params.Foo(value) => value }
<console>:10: error: value applyDynamic is not a member of object Params
error after rewriting to Params.<applyDynamic: error>("Foo")
possible cause: maybe a wrong Dynamic method signature?
Map("Foo" -> "bar") match { case Params.Foo(value) => value }
^
<console>:10: error: not found: value value
Map("Foo" -> "bar") match { case Params.Foo(value) => value }
^
What I find amazing since
object Params {
object Foo {
def unapply{params: Map[String, String]): Option[String] = …
}
}
will work fine. Also, if I assign the Params.Foovariable first , everything will be fine:
scala> val Foo = Params.Foo
Foo: AnyRef{def unapply(params: Map[String,String]): Option[String]} = Params$$anon$1@f2106d8
scala> Map("Foo" -> "bar") match { case Foo(value) => value }
warning: there were 1 feature warning(s); re-run with -feature for details
res2: String = bar
Should this be considered a mistake?