3

Dプログラミング言語を使用しています。struct最初にゼロ以外の値で満たされた s の多次元静的配列を含む が必要intです (私の場合、ゼロは有効なエントリであり、最初にすべてのエントリを無効としてマークしたいと考えています)。であるため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コンパイルされますが、最初の 3 要素の部分配列のみがsで埋められます。他の 2 つのサブ配列には、ガベージのようなものが含まれています。それはある種の部分的な初期化機能ですか?私には、無効なコードを受け入れるコンパイラのようなバグのように見えます。

  4. int [SIZE] [SIZE] a = [NA];最初の部分配列をに設定し[-1, 0, 0]、残りを前の試行と同じガベージに設定します。

  5. fillにもありますが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 に答える