首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象方法如何引用该对象的内部类?

对象方法如何引用该对象的内部类?
EN

Stack Overflow用户
提问于 2021-06-09 15:02:35
回答 1查看 46关注 0票数 0

我在浏览Scalameta's code named Trees.scala时,偶然发现了这段我很难理解的代码。

代码语言:javascript
复制
@branch trait Name extends Ref { def value: String }
object Name {
  def apply(value: String): Name = if (value == "") Name.Anonymous() else Name.Indeterminate(value)
  def unapply(name: Name): Option[String] = Some(name.value)
  @ast class Anonymous() extends Name {
    def value = ""
    checkParent(ParentChecks.NameAnonymous)
  }
  @ast class Indeterminate(value: Predef.String @nonEmpty) extends Name
}

在这里,Metals指出

代码语言:javascript
复制
value Indeterminate is not a member of scala.Meta.Name
value Anonymous is not a member of scala.Meta.Name

因此,它抱怨apply不能引用内部类。尽管如此,源代码实际上还是成功编译了。然而,下面的代码不是这样的,上面的代码基本上归结为:

代码语言:javascript
复制
trait Hihi {   }
object Hihi {
  def apply(value: String): Hihi = if (value == "") Hihi.Class1() else Hihi.Class2()
  @ast class Class1() extends Hihi {
    def value = ""
  }
  @ast class Class2() extends Hihi
}

scalac编译器指出Class1Class2不是Hihi的成员。那么,为什么Scalameta的代码会编译,而另一个更简单的代码却会失败呢?

EN

回答 1

Stack Overflow用户

发布于 2021-06-09 19:22:30

这对我来说很有效,没有注释(在Scala2中,因此BarBazcase classes):

代码语言:javascript
复制
trait Foo { }

object Foo {
  def apply(v: String): Foo = if (v.isEmpty) Foo.Bar() else Foo.Baz(v)

  case class Bar() extends Foo { def value = "" }
  case class Baz(value: String) extends Foo
}

我怀疑如果您的作用域中没有ast注释,@ast class Class1将无法编译,从而导致Class1不是成员。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67899120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档