Proposal: create an Extractor for PartialFunction
杨博 <[email protected]>
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <[email protected]> |
Sometimes, when I create a method, I need an extractor parameter for
pattern matching, while there is not a generic extractor trait in the Scala
Standard Library. So we have to use a PartialFunction as the parameter
instead.
When I use the PartialFunction, I had to create pattern matching expression
like this.
input match {
case x if partialFunction.isDefined(x) =>
val data = partialFunction.apply(x)
doSomethingWith(data)
}
This approach is not perfect because:
1. partialFunction.isDefined and partialFunction.apply checked x twice,
which is slow if isDefined has complex logical, checking whether a file
exists for example.
2. The if condition around temporary variable x is too trivial.
I think the better approach is converting the PartialFunction to an
extractor and matching with that extractor
implicit final class PartialFunctionAsExtractor[A, B](pf:
PartialFunction[A, B]) {
object Extractor {
def unapply(a: A) = PartialFunction.condOpt(a)(pf)
}
}
input match {
case partialFunction.Extractor(data) =>
doSomethingWith(data)
}
Since this is a common approach, I hope adding the
PartialFunctionAsExtractor to scala.Predef .
I would like to create a pull request if people like this idea.
--
You received this message because you are subscribed to the Google Groups "scala-language" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.