2014-10-07 75 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

相关问题