我需要同时生成几个布尔值

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 更改,因此您需要更新所有引用 Ipv4EnIpv6En.

的代码

除了将两个字段分组到 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 的实现,而不必触及使用它的任何其他代码。