2016-10-06 8 views
0

スカラのパターンマッチングを使用したいスカラコードがあります。コードが行うことは、クラスのパブリックゲッターを取得し、メソッド名をjsonキーとして、メソッド値をjson値(オブジェクトまたは配列の場合はシリアル化)として追加することです。ここでは、コードがあります:スカラ:式に基づいた一致

private def serialize(any: Any): JsonObject = { 
    val json = new JsonObject() 
    val rm = scala.reflect.runtime.currentMirror 
    val accessors = rm.classSymbol(any.getClass).toType.members.collect { 
    case m: MethodSymbol if m.isGetter && m.isPublic => m 
    } 
    val instanceMirror = rm.reflect(any) 
    for (accessor <- accessors) { 
    val key = properCase(accessor.name.toString) 
    val value = instanceMirror.reflectMethod(accessor).apply() 
    if (accessor.returnType <:< typeOf[String]) 
     json.addProperty(key, value.asInstanceOf[String]) 
    else if (accessor.returnType <:< typeOf[Character]) 
     json.addProperty(key, value.asInstanceOf[Character]) 
    else if (accessor.returnType <:< typeOf[Boolean]) 
     json.addProperty(key, value.asInstanceOf[Boolean]) 
    else if (accessor.returnType <:< typeOf[Number]) 
     json.addProperty(key, value.asInstanceOf[Number]) 
    else if (accessor.returnType <:< typeOf[Iterable[Any]]) 
     json.add(key, serialize(value.asInstanceOf[Iterable[Any]])) 
    else 
     json.add(key, serialize(value.asInstanceOf[Any])) 
    } 
    json 
} 

私はこのような何かをしたいと思います:

accessors match { 
    case _.returnType <:< typeOf[String] => json.addProperty(
     properCase(key.name.toString), 
     instanceMirror.reflectMethod(accessor).apply().asInstanceOf[String]) 
    ... 
} 

しかし、コンパイラはその'=>' expected but '.' foundを言って、それに非常に不幸です。私は、コンパイラがmatch文の中の式を期待しておらず、(javaのように)定数を求めていると仮定します。スカラのマッチスタイル構文を式で使用する方法はありますか?

+0

を書くのか? –

+0

@JeanLogeart質問を更新しました。 – cscan

答えて

1

、エラーは何

case x if x.returnType <:< typeOf[String] => ... 
0

それは次のようにおよそ中途半端そこに着くことが可能です:

accessors.foreach { accessor => 
    val key = properCase(accessor.name.toString) 
    val value = instanceMirror.reflectMethod(accessor).apply() 
    value match { 
    case s: String => json.addProperty(key, s); 
    case c: Character => json.addProperty(key, c); 
    case b: Boolean => json.addProperty(key, b); 
    case n: Number => json.addProperty(key, n); 
    case i: Iterable[Any] => json.add(key, serialize(i)) 
    case _ => json.add(key, serialize(value)) 
    } 
} 

この式に基づいて一致していない、けれども。パターンマッチングでテストを持っている

関連する問題