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
が今チェックすることはできません、しかし、そうではありませんモジュールはトリックですか?オブジェクトとケースのオブジェクトを区別することはありません。 –
@ Jasper-M nope。 – Reactormonk