Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 符号是一个case对象吗?_Scala_Scala Reflect - Fatal编程技术网

Scala 符号是一个case对象吗?

Scala 符号是一个case对象吗?,scala,scala-reflect,Scala,Scala Reflect,我已经尝试过.asClass.primaryConstructor.isStatic,但是如果密封特征被定义为依赖类型,那就行不通了。Symbol\isModuleClass看起来它可以确定符号是否是对象,而foo.asClass.isClass可以确定它是否有大小写修饰符。请注意,asClass如果在其他类型的符号(方法、术语等)上使用,则会引发异常 对象测试: { sealed trait Sealed; case object Foo extends Sealed; case class

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

Symbol\isModuleClass
看起来它可以确定符号是否是
对象,而
foo.asClass.isClass
可以确定它是否有大小写修饰符。请注意,
asClass
如果在其他类型的符号(方法、术语等)上使用,则会引发异常

对象测试

{ 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
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
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
对于其他类型:

scala> bar.isModuleClass // case class
res28: Boolean = false

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

scala> foo.isModuleClass // case object
res30: Boolean = true
基于API文档,似乎
isModule
也应该工作,但它只为
companysymbol返回true。

案例测试

{ 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
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
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
对于其他类型(定义与上述示例相同):

把它放在一起

{ 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
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
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

现在无法检查,但isModule不起作用吗?但它不会区分对象和case对象。@Jasper-M不。