2014-10-07 72 views
1

在我創建的情況下給用戶相匹配Scala程序,以下從http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html爲什麼找不到這個班?

特別是一些片段,我宣佈延長另一個類的類,然後我嘗試的情況下對陣那個班。

user match { 
    case FreeUser(name) => "Hello " + name; 
    case PremiumUser(name) => "hello " + name; 
} 

這些操作都失敗:就好像情況子句不請參閱FreeUser和PremiumUser類,這是出現在其上方的類定義。

class FreeUser(val name: String) extends User{ 
    def unapply(user: FreeUser):Option[String] = Some(user.name); 
} 

//takes the object as input, returns the parameter used to construct it. 
class PremiumUser(val name: String) extends User { 
    def unapply(user: PremiumUser):Option[String]= Some(user.name); 
} 
val name = "ASDF" 
val user: User = new PremiumUser("jay"); 
user match { 
    /** This statement fails to comiple : not found, value FreeUser. **/ 
    case FreeUser(name) => "Hello " + name; 
    case PremiumUser(name) => "hello " + name; 
} 

對於全班,你可以參考這個要點。 https://gist.github.com/anonymous/e96107f91ef0262f3268

我的問題是,因此,簡單地說,如何引用Scala中的case子句中的內部類。

回答

2

的不應用方法必須在同伴對象定義:

object FreeUser { 
    def unapply(user: FreeUser):Option[String] = Some(user.name); 
} 

object PremiumUser { 
    def unapply(user: PremiumUser):Option[String]= Some(user.name); 
} 

我不能在此刻正式的東西,爲什麼你不能有不應用在課堂上找到,我想這是因爲在類匹配隱含地調用SomeObject.unapply並且這樣做不可能是一個類(你必須做new SomeClass.unapply,單身人士好得多)。

+0

這也正是我的問題 - 也就是爲什麼該方法不能是在課堂上,但現在,這種澄清是由於某種原因,解決了我的問題,不應用方法的同伴目標的實現是使用什麼。 。 謝謝! – jayunit100 2014-10-07 21:02:32

+0

考慮你的例子,你有一個以字符串爲參數的類,如果在類中定義了unapply方法,編譯器應該如何調用它?它不能提供一個新的課程,他不能調用當前正在匹配的類的不適用,因爲它還不知道它的類型(即你不知道是否可以調用不適用的方法)。 – 2014-10-07 21:05:23

4

freeUser和PreimumUser類都應該是如下的case類;

/** 
* Why does FreeUser fail to compile? 
*/ 
object Sytax { 

    object Thrice { 
     def apply(x : Int) : Int = x *3 
     def unapply(z : Int) : Option[Int] = if (z%3==0) Some(z/3) else None 
    } 

    val x = Thrice(3); 

    trait User { 
    def name:String; 
    } 

    case class FreeUser(val name: String) extends User{ 
    def unapply(user: FreeUser):Option[String] = Some(user.name); 
    } 

    //takes the object as input, returns the parameter used to construct it. 
    case class PremiumUser(val name: String) extends User { 
    def unapply(user: PremiumUser):Option[String]= Some(user.name); 
    } 
    val name = "ASDF" 
    val user: User = new PremiumUser("jay"); 
    user match { 
    case FreeUser(name) => "Hello " + name; 
    case PremiumUser(name) => "hello " + name; 
    } 
} 
+0

這是一個很好的答案,但不像前者那麼簡潔。 :) – jayunit100 2014-10-07 21:01:30

相關問題