2

考虑以下:

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 可以在匹配语句中使用和重用。这不可能吗?

4

1 回答 1

5

我认为您只需将其用作函数,例如:

pf("$")

如果您将定义pf为,PartialFunction[String, Option[String]]您还可以使用其他有用的东西,例如pf.isDefinedAt("x").


如果您查看Scala 语言规范8.4 节模式匹配表达式,您会发现以下语法:

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

因此,正如您所看到的,无法按照您的描述使用它,但pf("$")行为方式相同。

于 2011-06-03T08:39:08.887 回答