これが機能するように、scalaでisCaseObject関数を作成するにはどうすればよいですか?
def isCaseObject(x:Any) = /* Some Code */
case object aCaseObject
println(isCaseObject(aCaseObject)) //true
println(isCaseObject("not a case object")) //false
これが機能するように、scalaでisCaseObject関数を作成するにはどうすればよいですか?
def isCaseObject(x:Any) = /* Some Code */
case object aCaseObject
println(isCaseObject(aCaseObject)) //true
println(isCaseObject("not a case object")) //false
リフレクション(Scala 2.10M4)を使用すると、これは次のように実行できます。
import scala.reflect.runtime.universe.Flag
import scala.reflect.runtime.{ currentMirror => cm }
object Check {
def isCaseObject(x:Any): Boolean = {
cm.reflect(x).symbol.hasFlag(Flag.CASE)
}
}
すべてのケースクラスはProductを拡張するため、型システムを使用できます。
def isCC[A](a: A)(implicit ev: A <:< Product) = a
あなたがそれを非製品で呼ぼうとすると:
scala> isCC("test")
<console>:17: error: Cannot prove that java.lang.String <:< Product.
isCC("test")
ただし、ケースクラスを使用して呼び出すことができます。
scala> case class CA(a: Int)
defined class CA
scala> isCC(CA(1))
res19: CA = CA(1)