【问题标题】:create type from pattern matching in scala从scala中的模式匹配创建类型
【发布时间】:2013-07-29 13:10:31
【问题描述】:

我是使用 Scala 的新手,我需要创建一个基于某些模式匹配函数的动态类型,例如

type defType = "value1" match {
  case "value0" => typeOf[String]
  case "value1" => typeOf[Integer]
  case _ => typeOf[Double]
}

val test5 : defType = 4

这只是一个示例,因为我将使用更复杂的结构,但给出了我想要做什么的想法。

【问题讨论】:

  • 模式匹配是一种运行时机制,这是不可能的。查看 Scala 宏

标签: scala types pattern-matching


【解决方案1】:

我可能不明白你在做什么,但这对我来说似乎有问题:

val test5 : defType = 4

编译器需要能够在编译时知道defType,否则无法进行类型检查。基于此,我认为您想要做的是在编译时使用Scala macros 进行这种模式匹配。

但是,我觉得这也不是正确的解决方案,因为整个场景看起来很奇怪。如果您更详细地说明您正在尝试做的事情的大局,也许我们可以提出更好的解决方案。

【讨论】:

    【解决方案2】:

    出于基本的概念原因,我担心这是不可能的。由于在编译时会检查类型规则,因此不可能基于在运行时之前可能未知的值派生类型。

    话虽如此,您可以通过定义case classes 系列来解决您的设计问题,每个case classes 都是特定类型值的包装器。通过为这些类提供一个公共基类,您可以将任何类型的值存储到同一个变量中,并通过类型安全的模式匹配提取它:

    class Base
    case class AString(val value: String) extends Base
    case class AnInt(val value: Int) extends Base
    case class ADouble(val value: Double) extends Base
    
    val a : Base = "value1" match {
      case "value0" => AString(…)
      case "value1" => AnInt(…)
      case "value0" => ADouble(…)
    }
    
    a match {
      case AString(s) => …
      case AnInt(i) => …
      case ADouble(i) => …
      …
    }
    

    【讨论】:

    • 有人指出您的案例类需要扩展Base——但编辑在我接受之前就被拒绝了。
    • @DaoWen 谢谢,我忘记了extends 子句。我编辑了答案。
    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 2018-01-03
    • 2013-03-17
    • 2014-03-05
    • 2021-02-15
    • 2017-08-18
    • 2011-08-11
    相关资源
    最近更新 更多