initialization immutable array

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Thu May 15 10:15:50 PDT 2014


On Thu, 15 May 2014 12:13:58 -0400, AntonSotov <nepuvive at rainmail.biz>  
wrote:

> DMD 2.065
> I do not know much English. sorry.
>
> need to initialize immutable array  "_items"
> //-------------------------------------------------------
> module main;
> import std.stdio;
>
> class Zond {
>    this() {
>      foreach (i; 1..4) {
>        _items ~= i;  // is expected ERROR
>      }
>    }
>
>    immutable(int[]) _items;
> }
>
> int main(string[] args)
> {
>    // create
>    auto zond = new Zond();
>    // test output
>    foreach (it; zond._items) {
>      writeln(it);
>    }
>    return 0;
> }
> //-------------------------------------------------------
> this method does not work:
> Error: field _items initializing not allowed in loops or after labels.

Assign _items only once in the constructor.

immutable(int)[] tmp;

foreach(i; 1..4)
    tmp ~= i;

_items = tmp;

> Make a small change, I add a nested function "addItem":
> //-------------------------------------------------------
> module main;
> import std.stdio;
>
> class Zond {
>    this() {
>      void addItem(in int value) {
>        _items ~= value;  // OK ,  why?
>      }
>
>      foreach (i; 1..4) {
>        addItem(i);
>      }
>    }
>
>    immutable(int[]) _items;
> }
>
> int main(string[] args)
> {
>    // create
>    auto zond = new Zond();
>    // test output
>    foreach (it; zond._items) {
>      writeln(it);
>    }
>    return 0;
> }
> //-------------------------------------------------------
> This method initialization works. why?
> I do not understand the difference.

This should not work IMO.

-Steve


More information about the Digitalmars-d mailing list