【问题标题】:Why is this class not found?为什么找不到这个类?
【发布时间】:2014-10-07 20:36:46
【问题描述】:

在一个 scala 程序中,我创建了一个匹配用户的案例,遵循来自 http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html

的一些 sn-ps

特别是,我声明了一个扩展另一个类的类,然后我尝试对该类进行大小写匹配。

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

这些操作都失败了:好像 case 子句没有看到 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 子句中引用内部类。

【问题讨论】:

    标签: scala inner-classes


    【解决方案1】:

    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;
      }
    }
    

    【讨论】:

    • 这是一个很好的答案,但不如前一个简洁。 :)
    【解决方案2】:

    unapply 方法必须在伴随对象中定义:

    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,单例更好)。

    【讨论】:

    • 这正是我的问题 - 为什么该方法不能在类中,但现在,通过澄清由于某种原因,unapply 方法的伴随对象实现是什么,这解决了我的问题用过..谢谢!
    • 考虑你的例子,你有一个以字符串为参数的类,如果类中定义了 unapply 方法,编译器应该如何调用它?它当然不能分离一个新类,他也不能调用 unapply 正在匹配的当前类,因为它还不知道它的类型(即你不知道你是否可以调用 unapply 方法)。跨度>
    猜你喜欢
    • 2013-09-08
    • 2019-12-26
    • 2015-04-11
    • 2011-09-06
    • 2022-01-05
    • 2011-08-03
    • 2020-05-26
    • 2014-01-05
    • 2015-06-22
    相关资源
    最近更新 更多