3

我正在使用 D 编程语言。我想要一个struct包含ints 的多维静态数组,最初用一个非零值填充(在我的情况下,零是一个有效条目,我想最初将所有条目标记为无效)。因为它是一个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;即使使用当前的 beta 版本也无法编译:dmd-2.066-b2。

  2. int [SIZE] [SIZE] a = NA.repeat (SIZE).array ();编译并做这件事。尽管如此,一致性仍然受到影响。

  3. int [SIZE] [SIZE] a = [NA, NA, NA];看起来它本质上是上面的表达式,简化了。它编译但仅用NAs 填充第一个三元素子数组。另外两个子数组包含一些类似垃圾的东西。这是某种部分初始化功能吗?对我来说,它看起来更像是一个错误,比如编译器接受无效代码。

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

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

4

1 回答 1

2

像这样的东西怎么样:

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);
}
于 2014-07-15T09:19:24.593 回答