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

标签 multidimensional-array initialization d dmd member-initialization

我正在使用 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([[-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 填充第一个三元素子数组。 另外两个子数组包含一些类似垃圾的东西。 这是某种部分初始化功能吗? 在我看来,它更像是一个错误,比如编译器接受了无效代码。

  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);
}

关于multidimensional-array - D - 为多维静态数组的结构成员设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24600796/

相关文章:

user-interface - 用于 GUI 桌面应用程序的 Haskell 或 D?

c++ - 内存泄漏在哪里?

javascript - 跳过每个()中的第一个元素?

java - 如何在 Java 中显式调用静态初始化器?

java - 在抽象类中保存数据的最佳实践

inheritance - D:继承静态变量,按类区分?

javascript - 使用 FOR 循环将值存储在变量中,例如多维数组值

java - 返回多个 ArrayList<ArrayList<String>>

javascript - 声明具有多个字段的javascript数组

javascript - d服务器与javascript如何通信