Как я могу использовать PartialFunctions для составления своих операторов сопоставления? - PullRequest
2 голосов
/ 03 июня 2011

Рассмотрим следующее:

scala> object Currency extends Enumeration {
     |   type Currency = Value
     |   val USD = Value
     |   val GBP = Value
     |   val EUR = Value
     |   val TRY = Value // Turkish lira
     |   val NGN = Value // Nigerian naira
     | }
defined module Currency

scala> import Currency._
import Currency._

scala> val pf: (String) => Option[Currency] = {
     |     case "$" => Some(USD)
     |     case "€" => Some(EUR)
     |     case "£" => Some(GBP)
     |     case "₦" => Some(NGN)
     |     case _ => None
     |   }
pf: (String) => Option[Currency.Currency] = <function1>

Я думал, что смогу тогда сделать это:

scala> "$" match pf
<console>:1: error: '{' expected but identifier found.
       "$" match pf
                 ^

Но нет.Я что-то упустил здесь?Я надеялся, что моя функция PartialFunction может быть использована и повторно использована в выражениях совпадений.Разве это не возможно?

1 Ответ

5 голосов
/ 03 июня 2011

Я думаю, вам просто нужно использовать его как функцию, например:

pf("$")

Если вы определите pf как PartialFunction[String, Option[String]], вы также можете использовать другие полезные вещи, такие как pf.isDefinedAt("x").


Если вы загляните в Спецификация языка Scala section 8.4 Выражения сопоставления с образцом , вы найдете следующий синтаксис:

Expr ::= PostfixExpr ‘match’ ‘{’ CaseClauses ‘}’
CaseClauses ::= CaseClause {CaseClause}
CaseClause ::= ‘case’ Pattern [Guard] ‘=>’ Block

как вы можете видеть, его невозможно использовать, как вы описали, но pf("$") действует так же.

...