繁体   English   中英

TypeTag与简单模式匹配

TypeTag vs Simple Pattern Match

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

typeTag可能遗漏有关typeTag一些观点。 我想解释一下以下代码示例之间的区别,还有一些有用的typeTag ,以及有关其需求的更多解释。

  @throws[IllegalArgumentException]("if types mismatched and not equals to ComparableRelationDataType")
 def eval[T](checkedValue: T, checkedWithValue: T): Boolean = (checkedValue, checkedWithValue) match {
    case (x: String, y: String) if ruleValue.dataType == ComparableRelationDataType.String => ruleValue.eval[String](x, y)
    case (x: BigDecimal, y: BigDecimal) if ruleValue.dataType == ComparableRelationDataType.Numeric =>ruleValue.eval[BigDecimal](x, y)
    case (x: Boolean, y: Boolean) if ruleValue.dataType == ComparableRelationDataType.Boolean => ruleValue.eval[Boolean](x, y)
    case (x: Instant, y: Instant) if ruleValue.dataType == ComparableRelationDataType.Instant => ruleValue.eval[Instant](x, y)
    case _ => throw new IllegalArgumentException(s"Illegal ComparableRelationDataType on ${ruleValue.dataType}")
  }

  @throws[IllegalArgumentException]("if classTag not equals to ComparableRelationDataType")
  def eval[T](checkedValue: T, checkedWithValue: T)(implicit tag: TypeTag[T]) : Boolean = {
    ruleValue.dataType match {
      case ComparableRelationDataType.String if typeOf[String] =:= typeOf[T] => ruleValue.eval[String](checkedValue.asInstanceOf[String], checkedWithValue.asInstanceOf[String])
      case ComparableRelationDataType.Numeric if typeOf[BigDecimal] =:= typeOf[T]  => ruleValue.eval[BigDecimal](checkedValue.asInstanceOf[BigDecimal], checkedWithValue.asInstanceOf[BigDecimal])
      case ComparableRelationDataType.Instant if typeOf[Instant] =:= typeOf[T] => ruleValue.eval[Instant](checkedValue.asInstanceOf[Instant], checkedWithValue.asInstanceOf[Instant])
      case ComparableRelationDataType.Boolean if typeOf[Boolean] =:= typeOf[T] => ruleValue.eval[Boolean](checkedValue.asInstanceOf[Boolean], checkedWithValue.asInstanceOf[Boolean])
      case _ => throw new IllegalArgumentException(s"Illegal ComparableRelationDataType, got TypeTag: ${typeOf[T]} on ${ruleValue.dataType}")
    }
  }

谢谢!


编辑1:

ruleValue.eval代码:

 def eval[T <% Comparable[T]](checkedValue: T, checkedWithValue: T) : Boolean = {
    operator match {
      case GreaterThan => checkedValue.compareTo(checkedWithValue) > 0
      case GreaterThanEquals => checkedValue.compareTo(checkedWithValue) >= 0
      case LowerThanEquals => checkedValue.compareTo(checkedWithValue) <= 0
      case LowerThan => checkedValue.compareTo(checkedWithValue) < 0
      case Equals => checkedValue.compareTo(checkedWithValue) == 0
      case NotEquals => checkedValue.compareTo(checkedWithValue) != 0
    }
  }

ComparableRelationDataType:

sealed trait ComparableRelationDataType extends EnumEntry
object ComparableRelationDataType extends Enum[ComparableRelationDataType] {
  case object String extends ComparableRelationDataType
  case object Numeric extends ComparableRelationDataType
  case object Instant extends ComparableRelationDataType
  case object Boolean extends ComparableRelationDataType
  override def values: immutable.IndexedSeq[ComparableRelationDataType] = findValues
}

编辑2:外包API的用法:

  // ComparableRelation
      case rp @ ComparableRelationRulePart(ComparableRelationExpression(relationType, _), ComparableRelationHeader(name, otherName)) =>
        import scala.reflect.runtime.universe._
        def evalRelationOn[T](implicit r: Reads[T], tag: TypeTag[T]) = {
          val checkedValue = deepSearch(payload, name)
          val checkedWithValue = deepSearch(payload, otherName)
          (checkedValue.asOpt[T],checkedWithValue.asOpt[T]) match {

            // Found values on Payload
            case (Some(checkedValue), Some(checkedWithValue)) =>
              val tryRes = scala.util.Try(rp.eval[T](checkedValue, checkedWithValue))
              tryRes.fold(
                // Should not happen!
                exOccurred => {
                  logger.error(s"Failure occurred on RelationRulePart for values: [$checkedValue,$checkedWithValue] on actionRuleId: ${actionRule._id} with ex: ${exOccurred.getMessage}")
                  Metrics.errorsCounter("RelationRulePart", "actionRuleId" -> actionRule._id).increment()
                  (false, Some(Left(s"$name && $otherName"))) // Left is unmatched, there will be unmatched with &&.
                },
                status => (status, collectName(status, Some(Unit), name)) // Some(Unit) since its succeed/failed
              )

            // Cannot find some of the values on Payload
            case (Some(_), None) => (false, Some(Right(otherName)))
            case (None, Some(_)) => (false, Some(Right(name)))
            case (None, None) => (false, Some(Right(s"$name && $otherName")))
          }
        }
        relationType match {
          case ComparableRelationDataType.String => evalRelationOn[String]
          case ComparableRelationDataType.Numeric => evalRelationOn[BigDecimal]
          case ComparableRelationDataType.Instant => evalRelationOn[Instant]
          case ComparableRelationDataType.Boolean => evalRelationOn[Boolean]
        }
    }

总体而言,它只是一项规则服务:

输入:我正在将规则上载到系统中运行时: JsValue已到达,并检查了这些规则,正在从运行时中的值中解析数据。

问题暂未有回复.您可以查看右边的相关问题.
1 Clojure简单模式匹配

作为我上一个问题的后续跟进,我试图在Clojure中实现一个简单的模式匹配。 我想要以下内容: 用法: 应安排在运行时执行expr2 。 我想写一个宏,但我不确定扩展。 我正在考虑将每个case-and-clause扩展为let ,绑定到内部变量并检查文字符号( ...

2 Scala简单模式匹配非常慢

给出以下读取电子邮件并对其进行解析的代码... 第七行, case content: String =&gt;确实很慢。 我当时以为我的解析函数很慢,但是在不到一毫秒的时间对其进行概要分析后,并没有真正意识到模式匹配可能是罪魁祸首。 模式匹配大约需要250-300ms。 因为j ...

3 NSString简单模式匹配

Mac OS 10.6,Cocoa项目,需要10.4兼容性。 (请注意:我对正则表达式的了解非常少) 我需要解析NSStrings,以匹配字符串包含嵌入式标签的情况,其中标签格式为: [ⅩⅩⅩⅩ] 其中xxxx是随机字符。 例如:“快速的棕色[狐狸]狐狸喜欢袜子”。 ...

4 Haskell中的简单模式匹配

我是Haskell的初学者,我尝试在WinGHCi中输入以下内容: 但是当我这样做时,WinGHCi卡住了,什么也没做。 为什么不打印出阶乘5? ...

2016-10-06 08:40:46 1 91   haskell
5 Clojure中的简单模式匹配

我在Clojure中有一个字符串,我想命名并提取比赛的各个部分。 执行此操作的标准方法是: 但是,我希望能够命名和访问匹配的部分。 这是一个例子: 当我将mystring与模式列表匹配时,我希望结果类似于{:sqrt 6, :root 2} 。 更新资料 我找 ...

6 python中的简单模式匹配

我试图用python编写一个基本的解释器。 因此,我正试图声明在命令提示符下输入的字符串是方法还是变量类型。 所以不要尝试任何奇特的东西。 什么是健壮的方法(例如,..健壮的空格...如果语法不正确则抛出错误) 我的代码很简单 上面的命令在第2种情况和第3种情况下有 ...

2013-02-09 23:03:11 1 179   python
7 将字符串与简单模式匹配

我正在尝试将来对我正在创建的程序进行证明,以使需要用户输入的模式不会被硬编码。 字母或数字的样式总是有可能改变的,但是当它改变时,我需要每个人保持一致。 另外,我希望经理们能够控制一切而不必依靠我。 是否可以使用正则表达式或其他字符串工具将输入与数据库中存储的列表进行比较。 我希望它很容 ...

9 Scala模式匹配错误,“错误的简单模式:错误使用_ *(不允许序列模式)”

我正在编写Coursera的作业,我遇到了有关Scala模式匹配的问题。 “Scala编程”一书有以下代码: 所以我写了一个类似的代码来计算列表中每个字符的频率: 但是,编译器抱怨: 虽然我以另一种方式成功实现了这个方法,但是在2个辅助函数的帮助下,我不知道为什么不 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM