2013-01-22 64 views
4

如何在特质中使用不适用?斯卡拉不适用于性状

import play.api.libs.json.Json 

trait Json[T] { 

    implicit val jsonFormat = Json.format[T] 

} 

给出编译错误:

No unapply function found 

我可以采用某种强制编译器绑定吨至案例类,所以我可以利用不应用?

回答

1

这是斯卡拉的extractors存在的要求。提取器是一种称为unapply的方法,通常在对象(通常是所讨论的类型的伴随)中定义。它用于将价值解构成其成分。

下面是一个例子(很做作):

object Extractor1 { 
    def unapply(a: Any): Option[(String, Int)] = 
    Some(a.toString, a.toString.length) 
} 

object ExtractorUse { 
    import Extractor1._ 
    def use { 
    "23 skeedo!" match { 
     case Extractor1(str, length) => printf("str=\"%s\"; length=%d%n", str, length) 
    } 
    } 
} 

在使用中:

scala> ExtractorUse.use 
str="23 skeedo!"; length=10 

如果提取返回None,对手试图将失败。同样,如果结果的逻辑与case条款中提供的模式变量不一致。

还有一个提取序列的对应物,unapplySeq。有关详细信息,请参阅Scala中的编程链接