为多维静态数组的结构成员设置默认值



我使用的是D编程语言。我想要一个包含多维静态int数组的struct,该数组最初填充了一个非零值(在我的情况下,零是一个有效的条目,并且我想最初将所有条目标记为无效)。因为它是一个struct,所以它不能有默认构造函数。相反,我可以为struct的成员提供一个默认值。

问题是:我如何写这个多维数组值在一个简短的和可读的方式?有什么方便的函数、特殊情况语法或习语来做到这一点吗?


这是我想到的。

import std.range;
import std.stdio;
struct S
{
    static immutable int SIZE =  3;
    static immutable int NA   = -1;
    int [SIZE] [SIZE] a = NA.repeat(SIZE).array().repeat(SIZE).array();
}
void main()
{
    S s;
    writeln(s);
}

按预期打印-1 s数组:

S([[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]])

尽管如此,表达式NA.repeat(SIZE).array().repeat(SIZE).array()看起来很长,我怀疑可能有更好(更习惯,更可读)的方式来表达我的意图。


更新:

  1. int [SIZE] [SIZE] a = NA;不编译,即使是当前的测试版:dmd-2.066-b2。

  2. int [SIZE] [SIZE] a = NA.repeat (SIZE).array ();编译并执行任务。

  3. int [SIZE] [SIZE] a = [NA, NA, NA];看起来基本上是上述表达式的简化。它编译但只用NA s填充第一个三元素子数组。另外两个子数组包含一些类似垃圾的东西。这是某种局部初始化特征吗?对我来说,它看起来更像是一个bug,就像编译器接受无效代码一样。

  4. int [SIZE] [SIZE] a = [NA];将第一个子数组设置为[-1, 0, 0],其余子数组设置为与前一次尝试相同的垃圾。

  5. std.algorithm中也有fill,但它适用于范围(而不是范围的范围),并且看起来不像在初始化器中容易使用。至少不会更短。

这样怎么样:

module main;
import std.stdio: writeln;
enum SIZE =  3;
enum NA = -1;
struct Int {
    int v = -1;
    alias v this;
}
struct S
{
    Int [SIZE] [SIZE] a;
}
void main()
{
    S s;
    writeln(s);
}

相关内容

  • 没有找到相关文章

最新更新