2014-10-07 3 views
1

В программе лестницы я создал случай, чтобы соответствовать пользователю, после некоторых фрагментов из 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

Таким образом, мой вопрос заключается в том, как просто ссылаться на внутренний класс в случае case в Scala.

ответ

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

+0

Рассмотрим ваш пример, у вас есть класс, который принимает строку как параметр, если метод unapply был определен в классе, как должен компилятор его назвать? Он не может определять новый класс курса, и он не может назвать недопустимым совпадение текущего класса, поскольку он еще не знает его тип (т. Е. Вы не знаете, можете ли вы вызвать метод unapply). –

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