我需要同时生成几个布尔值
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
内部看起来太深,您应该定义以下两个方法:
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
的实现,而不必触及使用它的任何其他代码。
我有:
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
内部看起来太深,您应该定义以下两个方法:
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
的实现,而不必触及使用它的任何其他代码。