[英]I need to gen several bools simultaneously
我有:
struct MyStruct {
!Ipv4En : bool;
!Ipv6En : bool;
keep Ipv4En == TRUE or Ipv6En == TRUE;
MyMethod() is {
gen Ipv4En;
gen Ipv6En;
};
};
我总是将Ipv4En设为TRUE,因为这两个布尔值不会一起生成。 我生成MyStruct时无法生成它们。 我如何一起生成它们?
同时我打了补丁(不喜欢解决方案):我已经删除了! 在定义中。
temp : MyStruct;
gen temp;
Ipv4En = temp.Ipv4En;
Ipv6En = temp.Ipv6En;
由于gen
动作只需要一个gen-item
,因此您必须将要求解的两个变量组合在一起。 您可以通过定义一个新的struct
来做到这一点:
struct IpVersionInfo {
Ipv4En: bool;
Ipv6En: bool;
keep Ipv4En == TRUE or Ipv6En == TRUE;
};
而不是为您的启用使用两个变量,而是使用这个新的struct
类型的单个变量:
struct MyStruct {
!ipVersionInfo: IpVersionInfo;
MyMethod() is {
gen ipVersionInfo;
};
};
如果运行几次迭代,您将看到可以达到所有组合:
extend sys {
run() is also {
for i from 1 to 20 {
var s: MyStruct = new;
s.MyMethod();
outf(
"Ipv4En = %s, Ipv6En = %s\n",
s.ipVersionInfo.Ipv4En,
s.ipVersionInfo.Ipv6En);
};
};
};
但是,这需要更改API,因此您需要更新所有引用Ipv4En
和Ipv6En
代码。
除了将两个字段组合到一个struct
,还有其他解决问题的方法。 另一个示例是定义一个包含您的法律案件值的enum
:
type ip_version_info_e: [ V4, V6, BOTH ];
和以前一样,您可以在struct
使用这种类型的变量:
struct MyStruct {
!ip_version_info: ip_version_info_e;
MyMethod() is {
gen ip_version_info;
};
};
如果运行新代码的几次迭代,您会发现它也可以达到所有可能的组合:
extend sys {
run() is also {
for i from 1 to 20 {
var s: MyStruct = new;
s.MyMethod();
outf(
"Ipv4En = %s, Ipv6En = %s\n",
s.ip_version_info in [ V4, BOTH ],
s.ip_version_info in [ V6, BOTH ]);
};
};
};
无论您决定如何解决该问题,都应该对使用MyStruct
任何客户端代码隐藏内部实现。 注意,根据我们选择处理IP版本设置的方式,上面的out
语句看起来有所不同。 不应让客户端代码在MyStruct
内看起来太深, MyStruct
应定义以下两种方法:
isIpv4Enabled(): bool;
isIpv6Enabled(): bool;
在将两个布尔变量分组到一个struct
中的情况下,这两个方法的实现是:
struct MyStruct {
// ...
isIpv4Enabled(): bool is {
result = ipVersionInfo.Ipv4En;
};
isIpv6Enabled(): bool is {
result = ipVersionInfo.Ipv6En;
};
};
在定义enum
的情况下,我们有:
struct MyStruct {
// ...
isIpv4Enabled(): bool is {
result = ip_version_info in [ V4, BOTH ];
};
isIpv6Enabled(): bool is {
result = ip_version_info in [ V6, BOTH ];
};
};
但是,在两种情况下,用于打印的客户端代码都是相同的:
extend sys {
run() is also {
for i from 1 to 20 {
var s: MyStruct = new;
s.MyMethod();
outf(
"Ipv4En = %s, Ipv6En = %s\n",
s.isIpv4Enabled(),
s.isIpv4Enabled());
};
};
};
这是一个主要优势。 这样,您将来就可以自由更改MyStruct
的实现,而不必接触使用它的任何其他代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.