int i;    // auto-initialized to int.init
int i = void; // not initialized

There is no ambiguity. If you want to play with non-initialized values
(and play a superhero) you have to work extra and "initialize" those
variables with void, which means they're uninitialized.

On 12/26/10, spir <[email protected]> wrote:
> Hello,
>
> I have a problem with D's auto-init feature. When reading in someone else's
> code
>       int i;
> there is no way, I guess, to know whether this means "i is initialised to 0"
> or "i is left undefined". For this reason, in the former case I do
> explicitely initialise. Thus,
>       int i = 0;      // means initialised
>       int i;          // means undefined _for me_
> But, as _for me_ emphasizes, another reader still cannot guess the latter
> case.
>
> I would enjoy having an idiom to express this clearly. Without it, a
> possibility may be to use a conventional comment like
>       int i;  // undef
> in public code (esp Phobos) and spread the word about it. (Then, variable
> declarations without init or comment are known to be by people who do not
> use this convention, and we know we need to search farther in code to
> interpret them.)
>
> Note that this problem does not apply to floats or pointers/refs, for which
> .init is invalid for operating anyway. But there is a weird ambiguity about
> null/uninitialised arrays & strings which behave like empty in most cases. I
> would enjoy this to be clarified as well. For instance:
>       int[] ints1 = [];
>       ints1 ~= 1;             // ok
>       int[] ints2;
>       ints2 ~= 1;             // error
> So that arrays behave like pointed/ref'ed thingies. (But I'm unsure about
> the best way.) (*)
>
> Denis
>
> (*) This is also related to the boolean / null-compare value os arrays and
> strings:
> void main()
> {
>     writeln("array -- undef");
>     int[] ints1;
>     writeln('(',ints1,')');
>     if (ints1) writeln("ints1");
>     if (ints1 != null) writeln("ints1");
>     if (ints1 !is null) writeln("ints1");
>     ints1 ~= 1;
>     writeln('(',ints1,')');
>
>     writeln("array -- def");
>     int[] ints2 = [];
>     writeln('(',ints2,')');
>     if (ints2) writeln("ints2");
>     if (ints2 != null) writeln("ints2");
>     if (ints2 !is null) writeln("ints2");
>     ints2 ~= 1;
>     writeln('(',ints2,')');
>
>     writeln("string -- undef");
>     string str1;
>     writeln('(',str1,')');
>     if (str1) writeln("str1");
>     if (str1 != null) writeln("str1");
>     if (str1 !is null) writeln("str1");
>     str1 ~= '1';
>     writeln('(',str1,')');
>
>     writeln("string -- def");
>     string str2 = "";
>     writeln('(',str2,')');
>     if (str2) writeln("str2");
>     if (str2 != null) writeln("str2");
>     if (str2 !is null) writeln("str2");
>     str2 ~= '1';
>     writeln('(',str2,')');
> }
> ==>
> array -- undef
> ()
> ([1])
> array -- def
> ()
> ([1])
> string -- undef
> ()
> (1)
> string -- def
> ()
> str2
> str2
> (1)
> -- -- -- -- -- -- --
> vit esse estrany ☣
>
> spir.wikidot.com
>
>

Reply via email to