2

抽象的で、一連のケースクラスを持つクラスAを想像してみてください。セットクラスの数や、それらのケースクラスの名前すらわかりません。

abstract class A(field: String)
//Example of a case class that extends A
case class B(f: String) extends A(f)

今私はこれを持っています:

a match {
    case B(f) => println("f")
}

そして、引数でcaseクラス型をメソッドに渡したい。これが必要な理由は、ファイルに一連のルールを構成するためです。そして、それらのルールをロードし、それらのルールが提供するいくつかの情報とのパターンマッチングを使用したいと思います。私はこのようなことをしたい:

def printer (a: A, B: A) = {
   a match{
       case B(f) => println("f")
   }
}

これは可能ですか?

それほど簡単ではない場合、パターンマッチングで抽象クラスを使用できますか?抽象クラスはすべてのケースクラスの主要な構造を持っているので、単純に抽象クラスを使用できれば完璧です。

編集:

ケースクラスは異なる引数を持つ可能性があるため、クラスAに基づいたものを使用することをお勧めします(フィールドとのみパターンマッチングを実行できるため)

4

3 に答える 3

5

あなたがそれを試したようではありません。ただし、マニフェストをコンテキスト バインドとして使用する場合は、それを機能させることができます。

scala> trait Foo
defined trait Foo

scala> case class Bar(baz: String) extends Foo
defined class Bar

scala> def boo[A <: Foo : Manifest](foo: Foo) =
     |   if (foo.getClass isAssignableFrom manifest[A].erasure) "foo" else "boo"
boo: [A <: Foo](foo: Foo)(implicit evidence$1: Manifest[A])java.lang.String

scala> boo[Foo](Bar(""))
res0: java.lang.String = boo

scala> boo[Bar](Bar(""))
res1: java.lang.String = foo
于 2012-04-15T19:09:33.187 に答える
1

unapplyケースクラスのコンパニオンオブジェクトからメソッドを抽出して使用できます。

scala> :paste
// Entering paste mode (ctrl-D to finish)

abstract class A(field: String)
case class B(f: String) extends A(f)
case class C(f: String) extends A(f)
case class E(f: String, f1: Int) extends A(f)
case class F(f: String, f1: Int) extends A(f)

class Unapplyer[T: Manifest, R](f: T => Option[R]) {
  def unapply(a: Any): Option[R] = {
    if (manifest[T].erasure.isInstance(a)) f(a.asInstanceOf[T]) else None
  }
}

def printer[T: Manifest, R](a: A, b: T => Option[R]) {
  val P = new Unapplyer(b)
  a match {
    case P((f, f1)) => println(f + " - " + f1)
    case P(f) => println(f)
    case _ => println("oops")
  }
}

// Exiting paste mode, now interpreting.

defined class A
defined class B
defined class C
defined class E
defined class F
defined class Unapplyer
printer: [T, R](a: A, b: (T) => Option[R])(implicit evidence$2: Manifest[T])Unit

scala> printer(B("test"), B.unapply _ )
test

scala> printer(B("test"), C.unapply _ )
oops

scala> printer(E("test", 1), E.unapply _ )
test - 1

scala> printer(E("test", 1), F.unapply _ )
oops

scala> printer(E("test", 1), B.unapply _ )
oops

UPD:可変数と引数のタイプでの使用法を追加しました。

于 2012-04-15T19:45:25.597 に答える
0

タイプをメソッドに渡したい理由がわかりません。パターンマッチングを使用する場合は、とにかくタイプをチェックします。では、なぜそれを渡すのですか?あなたはただ書くことができます

abstract class A(field: String)
case class B(f: String) extends A(f)
case class C(i: Int) extends A(i.toString)

def printer (a: A) = {
   a match{
       case B(f) => println(f)
       case C(i) => println(i)
   }
}
于 2012-04-15T23:47:10.923 に答える