首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >符号是case对象吗?

符号是case对象吗?
EN

Stack Overflow用户
提问于 2017-03-08 17:16:48
回答 1查看 726关注 0票数 2
代码语言:javascript
复制
{ sealed trait Sealed; case object Foo extends Sealed; case class Bar(s: String) extends Sealed; trait Baz extends Sealed }
import scala.reflect.runtime.universe._
val List(bar, baz, foo) = symbolOf[Sealed].asClass.knownDirectSubclasses.toList

我已经尝试过.asClass.primaryConstructor.isStatic,但是如果密封的特征被定义为依赖类型,这是行不通的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-08 19:37:40

Symbol#isModuleClass看起来可以确定符号是否是objectfoo.asClass.isClass可以确定它是否有大小写修饰符。注意,如果在其他类型的符号上使用异常(方法、术语等),asClass会抛出异常。

对象测试

代码语言:javascript
复制
scala> bar.isModuleClass // case class
res28: Boolean = false

scala> baz.isModuleClass // trait
res29: Boolean = false

scala> foo.isModuleClass // case object
res30: Boolean = true

其他类型:

代码语言:javascript
复制
scala> val a = ""
a: String = ""

scala> symbolOf[a.type].isModuleClass
res34: Boolean = false

case class A(value: String) ; object A { def default = A("") }

scala> symbolOf[A].isModuleClass
res35: Boolean = false

scala> symbolOf[A.type].isModuleClass
res36: Boolean = true

基于API文档和西6012,似乎isModule也应该工作,但它只返回companionSymbol.的true。

案例测试

代码语言:javascript
复制
scala> bar.asClass.isCaseClass // case class
res44: Boolean = true

scala> baz.asClass.isCaseClass // trait
res45: Boolean = false

scala> foo.asClass.isCaseClass // case object
res46: Boolean = true

对于其他类型(与上面的例子相同的定义):

代码语言:javascript
复制
scala> symbolOf[a.type].asClass.isCaseClass // plain singleton object
res47: Boolean = false

scala> symbolOf[A].asClass.isCaseClass // case class
res48: Boolean = true

scala> symbolOf[A.type].asClass.isCaseClass // non-case object
res49: Boolean = false

把它放在一起

代码语言:javascript
复制
def isCaseObject(symbol: Symbol): Boolean =
  symbol.isModuleClass && symbol.asClass.isCaseClass

scala> isCaseObject(bar)
res50: Boolean = false

scala> isCaseObject(baz)
res51: Boolean = false

scala> isCaseObject(foo)
res52: Boolean = true

scala> isCaseObject(symbolOf[a.type])
res53: Boolean = false

scala> isCaseObject(symbolOf[A])
res54: Boolean = false

scala> isCaseObject(symbolOf[A.type])
res55: Boolean = false
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42677726

复制
相关文章

相似问题

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