如何使用PartialFunctions来组成我的匹配语句?

pr1*_*001 2 scala pattern-matching partialfunction

考虑以下:

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>
Run Code Online (Sandbox Code Playgroud)

我以为我能够做到这一点:

scala> "$" match pf
<console>:1: error: '{' expected but identifier found.
       "$" match pf
                 ^
Run Code Online (Sandbox Code Playgroud)

但不是.我错过了一些基本的东西吗?我希望我的PartialFunction可以在匹配语句中使用和重用.这不可能吗?

ten*_*shi 5

我认为你只需要将它作为一个函数使用,例如:

pf("$")
Run Code Online (Sandbox Code Playgroud)

如果你定义pf,PartialFunction[String, Option[String]]你也可以使用其他有用的东西pf.isDefinedAt("x").


如果您将查看Scala语言规范部分8.4模式匹配表达式,您将找到以下语法:

Expr ::= PostfixExpr ‘match’ ‘{’ CaseClauses ‘}’
CaseClauses ::= CaseClause {CaseClause}
CaseClause ::= ‘case’ Pattern [Guard] ‘=>’ Block
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到它不可能像您所描述的那样使用它,但pf("$")行为方式相同.

  • @ pr1001:这很有趣,因为在Scala 2.9中添加了通用的`try-catch-finally`.看起来它现在正是人们所期望的(这样你就可以给catch和其他块提供部分功能).也许`match`也会最终改变:) (2认同)