2013-07-28 42 views
0

我是新使用Scala和我需要的是营造出宛如基于一些模式匹配功能的动态类型匹配,就像创建模式类型Scala中

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

val test5 : defType = 4 

这仅仅是给出一个例子,我'要与更复杂的结构一起工作,但给出了我想要做的事情的想法。

+1

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

回答

1

我担心这是不可能的,因为基本的概念性原因。由于在编译时检查类型规则,所以不可能根据直到运行时才可能未知的值来派生类型。

也就是说,您可以通过定义一个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) => … 
    … 
} 
+0

有人指出你的case类需要扩展'Base',但编辑在我接受之前就被拒绝了。 – DaoWen

+0

@DaoWen谢谢,我忘了'extends'子句。我编辑了答案。 – denisw

1

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

val test5 : defType = 4 

编译器需要能够知道defType编译时,否则就不能键入检查。基于此,我认为你想要做的是在编译时通过利用Scala macros来进行这种模式匹配。

但是,我觉得这不是正确的解决方案,不是因为整个场景看起来很奇怪。如果您更详细地了解您想要做什么的更大局面,也许我们可以提出更好的解决方案。