如何创建参数化函数来检查不同类型的值

伯尼·黄

假设我必须检查从文件读入的名称/值对的哈希映射中的值,以查看这些值是否满足某些要求或约束。

val hm: mutable.HashMap[String, String] = mutable.HashMap()
hm.put("abc", 123)
hm.put("def", "xYx") 

我想写一些简单的检查,如下所示。例如,

evaluate("abc", 125, (x,y) => x == y)  // see if value of "abc" is equal to 125 (integer)
evaluate("def", "xyz", (x,y) => x.toLowerCase == y) // sse if the value of def is equal to xyz (all lower case) 
evaluate("abc", 400, (x,y) => x > y) // see if value is greater than 400

我尝试创建评估函数如下

def evaluate[T](p: String, expVal: T, f: (T, T) => Boolean): Boolean =  {
    if (!hm.contains(p)) false

    typeOf[T] match {
        case t if t =:= typeOf[String] => f(hm(p), expVal)
        case t if t =:= typeOf[Int] => f(hm(p).toInt, expVal)
        case _ => false
    }
}

当我运行以上时,我得到

Error:(16, 11) No TypeTag available for T
    typeOf[T] match {

Error:(16, 11) not enough arguments for method typeOf: (implicit ttag: reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.Type.
    Unspecified value parameter ttag.
    typeOf[T] match {

Error:(17, 45) type mismatch;
  found   : String
  required: T
  case t if t =:= typeOf[String] => f(hm(p), expVal)

我想知道您是否对评估功能有更好的建议。

提前致谢。

蒂姆

您的Map类型是[String, String]这样,您将始终从中获得类型值String因此,您尝试测试值的类型并没有取得任何成果,因为它总是String.

如果要保留此映射类型,则需要根据需要转换值,您还可以将测试值作为测试函数的一部分,而不是将它们作为单独的参数传递给evaluate.

def evaluate(key: String, pred: String => Boolean) =
  hm.get(key).exists(pred)

evaluate("abc", _.toInt == 125) // see if value of "abc" is equal to 125 (integer)
evaluate("def", _.toLowerCase == "xyz") // sse if the value of def is equal to xyz (all lower case)
evaluate("abc", _.toInt > 400) // see if value is greater than 400

如果值无法转换为 ,则第一个和第三个表达式将失败Int

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Ruby - 使用 nil 参数来支持不同类型的类

不同类型的重载函数和参数

如何基于不同的参数创建导出的函数别名以进行类型检查

有没有办法提供单个宏函数来返回不同类型的值,包括什么都不包含?

如何通过将不同的参数传递给构造函数来实例化不同的单例类

如何检查参数化构造函数参数的类型?

如何创建托管项目列表、实现接口但具有不同类型参数的类型?

在PostgreSQL中,如何声明一个接受不同类型参数的可变参数函数?

如何创建包含不同类型的集合

如何创建不同类型的变量堆栈?

在Spark / Scala中将不同类型的值作为参数传递给单个函数

如何给相同类型的多个函数参数?

如何在Java中使用接受扩展接口类型的参数的函数来创建接口?

如何表达函数的类型约束以允许添加不同类型的值?

如何创建可以处理具有不同类型参数的std :: set的模板类

意外函数返回不同类型/仅数字检查器

如何在C#中将2种不同类型传递给函数参数?

如何在scala中为不同类型的参数组合相同的函数

如何为具有6个不同类型和大小的参数的函数实现多处理

在C ++中,如何使构造函数具有不同类型的参数?

Rust函数根据类型注释返回不同类型的值

汇编如何进行参数传递:按值,引用,不同类型/数组的指针?

带有多个不同类型的可选参数的调用函数

将不同类型的参数传递给函数

F#两种不同类型的函数参数

使tqdm等函数在Python中接受不同类型的参数

如何创建一个类型函数来检查TypeScript中的类型是否为空对象?

如何创建可变参数模板函数来移动参数值并处理左值和右值?

用不同类型实例化的模板函数