2017-03-08 3 views
2
{ 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を試しましたが、シールされた特性が依存型として定義されている場合は動作しません。シンボルはケースオブジェクトですか?

+0

が今チェックすることはできません、しかし、そうではありませんモジュールはトリックですか?オブジェクトとケースのオブジェクトを区別することはありません。 –

+0

@ Jasper-M nope。 – Reactormonk

答えて

5

Symbol#isModuleClassシンボルがobjectであるかどうかを判断できるように見え、foo.asClass.isClassはケース修飾子があるかどうかを判断できます。 asClassは、他のタイプのシンボル(method、termなど)でも使用すると例外がスローされることに注意してください。

オブジェクトテスト:他のタイプの

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

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

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

:も動作するはずisModuleよう

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ドキュメントに基づいて

SI-6012はそれようだが、それだけのためにtrueを返しますthe companionSymbol.

ケーステスト:(上記の例と同じ意味)

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 
他のタイプの場合

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 

は一緒それを置く:

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 
関連する問題