【问题标题】:Scala: Match based on expressionScala:基于表达式的匹配
【发布时间】:2017-02-15 20:31:39
【问题描述】:

我有一些 scala 代码,我想使用 scala 的模式匹配。代码所做的是获取类的公共 getter,并将方法名称添加为 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])
  ...
}

但是,编译器对此很不满意,说'=&gt;' expected but '.' found。我假设编译器在 match 语句中不期望表达式并且想要一个常量(就像在 java 中一样)。有什么方法可以将 scala 的匹配样式语法与表达式一起使用?

【问题讨论】:

  • 错误是什么?
  • @JeanLogeart 我已经更新了问题。

标签: scala pattern-matching


【解决方案1】:

要进行模式匹配测试,请编写

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

【讨论】:

    【解决方案2】:

    有可能达到一半,如下所示:

    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))
      }
    }
    

    虽然,这不是基于表达式匹配的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多