如何投射类型'值的数据' Rascal中的其他类型的值?

时间:2017-03-07 14:01:13

标签: rascal

我有一个变量x = value:| java + interface:/// java / util / Iterator |。如何将其转换为x = loc:| java + interface:/// java / util / Iterator |?

1 个答案:

答案 0 :(得分:1)

简单的答案,模式匹配就像铸造一样。您可以以不同的方式使用它来使静态类型更具体:

value x = ... ;
if (loc l := x) {
   // here l will have the type `loc` and have the same value that `x` had
}

或:

value x = ...;
bool myFunc(loc l) = ...  ;
myFunc(x); // /* will only be executed if  x is indeeed of type `loc`

或者,您可以使用模式匹配来过滤列表:

list[value] l = ...;
list[loc] ll = [ e | loc e <- l ];

或,开关:

switch(x) {
  case loc l: ...;
}

等。 : - )

也可以编写通用的强制转换函数,但我认为使用它会产生代码味道,这会让代码更难理解:

&T cast(type[&T] t, value x) {
  if (&T e := x) 
     return e;
  throw "cast exception <x> can not be matched to <t>";
} 

value x = ...;
loc l = cast(#loc, x);