On Friday, 19 February 2021 at 10:02:05 UTC, Siemargl wrote:
On Friday, 19 February 2021 at 08:29:36 UTC, Ferhat Kurtulmuş wrote:

Since classes are reference types all instances of files will be the same reference of "new File()", which you probably don't want.

Is any differences between x and y definitions?

MyClass [] x, y;
x = new MyClass[7];

y= new MyClass[](8);

The only part of the documentation I've found that talks about this is here:
https://dlang.org/spec/expression.html#new_expressions

The main difference I know of comes with multidimensional arrays:

    auto a = new int[4][4];
    pragma(msg, typeof(a)); // Prints int[4][]
    auto b = new int[][](4,4);
    pragma(msg, typeof(b)); // Prints int[][]

Since the former is a dynamic array of static arrays, the first size parameter cannot be passed at runtime:

    auto n = 4;
    // Error: variable n cannot be read at compile time
    auto c = new int[n][n];

But must be a compiletime constant:

    enum N = 4;
    auto d = new int[N][n];
    pragma(msg, typeof(d)); // Prints int[4][]

The other syntax however, can take runtime values, but does not encode the size in the type:

    auto e = new int[][](n,n);
    pragma(msg, typeof(e)); // Prints int[][]

The other big thing about the []() syntax is it actually initializes the arrays of arrays for you:

    assert(e[0].length == n);

If you were to use new int[][n], you would need to initialize each array of arrays manually:

    auto f = new int[][n];
    assert(f[0].length == 0); // it's empty
    foreach (i; 0..n) {
        f[i] = new int[n]; // Have to do this yourself.
    }

--
  Simen

Reply via email to