Create an array with immutable elements
    bearophile 
    bearophileHUGS at lycos.com
       
    Thu Jun 14 17:14:10 PDT 2012
    
    
  
Roman D. Boiko:
> immutable struct Node{ string s; }
> Node[] f()
> {
>   Node[] arr = ...?
>   return arr;
> }
>
> How to fill an array, if its elements are immutable? I want to 
> assign values calculated by some function.
In general sometimes it's not easy to build immutable data 
structures.
In D there are several ways to do something similar to what you 
ask, some alternatives (maybe there are more possibilities):
-------------------------------------
immutable struct Node { string s; }
string bar(in int x) pure nothrow
in {
     assert(x >= 0 && x <= 9);
} body {
     return "hello" ~ cast(char)(x + '0');
}
Node[] foo() {
     Node[] arr;
     enum size_t N = 5;
     arr.reserve(N);
     foreach (i; 0 .. N)
         arr ~= Node(bar(i));
     return arr;
}
void main() {
     import std.stdio;
     //writeln(foo()); // try this!
     writeln(foo()[0]);
}
-------------------------------------
import std.exception;
struct Node { string s; }
immutable(Node)[] foo() {
     enum size_t N = 5;
     auto arr = new Node[N];
     foreach (i; 0 .. N)
         arr[i] = Node("hello" ~ cast(char)(i + '0'));
     return assumeUnique(arr);
}
void main() {
     import std.stdio;
     writeln(foo()[0]);
}
-------------------------------------
struct Node { string s; }
immutable(Node)[] foo() pure nothrow {
     enum size_t N = 5;
     auto arr = new Node[N];
     foreach (i; 0 .. N)
         arr[i] = Node("hello" ~ cast(char)(i + '0'));
     return arr;
}
void main() {
     import std.stdio;
     writeln(foo()[0]);
}
-------------------------------------
struct Node { string s; }
Node[] foo() pure nothrow {
     enum size_t N = 5;
     auto arr = new Node[N];
     foreach (i; 0 .. N)
         arr[i] = Node("hello" ~ cast(char)(i + '0'));
     return arr;
}
void main() {
     import std.stdio;
     immutable result = foo();
     writeln(result[0]);
}
Bye,
bearophile
    
    
More information about the Digitalmars-d-learn
mailing list