如何在 Rascal 中将 'value' 类型的数据转换为其他类型的值?
How to cast data of type 'value' to other type of values in Rascal?
我有一个变量 x = 值:|java+interface:///java/util/Iterator|。如何将其转换为 x = loc:|java+interface:///java/util/Iterator|?
简单回答,模式匹配就像铸造。您可以以不同的方式使用它来使静态类型更具体:
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);
我有一个变量 x = 值:|java+interface:///java/util/Iterator|。如何将其转换为 x = loc:|java+interface:///java/util/Iterator|?
简单回答,模式匹配就像铸造。您可以以不同的方式使用它来使静态类型更具体:
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);