<div>I have recently added a note about "init property is sometimes unsafe".<br></div><div><br></div><div><a href="https://github.com/D-Programming-Language/d-programming-language.org/pull/201">https://github.com/D-Programming-Language/d-programming-language.org/pull/201</a> <br>
</div><div class="gmail_extra"><br></div><div class="gmail_extra">To reduce the risk, I have proposed an enhancement for .init property usage.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><a href="http://d.puremagic.com/issues/show_bug.cgi?id=8752">http://d.puremagic.com/issues/show_bug.cgi?id=8752</a> <br>
<br>Kenji Hara<br><br><div class="gmail_quote">2012/12/16 js.mdnq <span dir="ltr"><<a href="mailto:js_adddot+mdng@gmail.com" target="_blank">js_adddot+mdng@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
On Saturday, 15 December 2012 at 20:20:10 UTC, H. S. Teoh wrote:<br>
<blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">

On Sat, Dec 15, 2012 at 12:02:16PM -0800, Jonathan M Davis wrote:<br>
<blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
On Saturday, December 15, 2012 11:45:10 H. S. Teoh wrote:<br>
> Ironically enough, Andrei in the subsequent paragraph > discourages<br>
> the use of such nested structs, whereas Walter's article > promotes<br>
> the use of such Voldemort types as a "happy discovery". :)<br>
<br>
No, the real irony is that it's Andrei who promoted them in the first<br>
place. :)<br>
</blockquote>
<br></div>
Heh. :)<div class="im"><br>
<br>
<br>
<blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
We _are_ finding some serious issues with them though (e.g. they don't<br>
work with init and apparently can't work with init), and there has<br>
been some discussion of ditching them due to such issues, but no<br>
consensus has been reached on that.<br>
</blockquote></div>
[...]<div class="im"><br>
<br>
Hmm, that's true. They can't possibly work with init: if you do<br>
something like:<br>
<br>
        auto func(int x) {<br>
                struct V {<br></div><div class="im">
                        @property int value() { return x; }<br>
                }<br></div><div class="im">
                return V();<br>
        }<br>
        auto v = func(123);<br>
        auto u = v.init;        // <-- what happens here?<br>
        writeln(u.value);       // <-- and here?<br>
<br>
It seems that we'd have to make .init illegal on these Voldemort<br>
structs. But that breaks consistency with the rest of the language that<br>
every type must have an .init value.<br>
<br>
Alternatively, .init can implicitly create a context where the value of<br>
x is set to int.init. But this is unnecessary (it's supposed to be a<br>
*Voldemort* type!) and very ugly (why are we creating a function's local<br>
context when it isn't even being called?), not to mention useless<br>
(u.value will return a nonsensical value).<br>
<br>
Or, perhaps a less intrusive workaround, is to have .init set the hidden<br>
context pointer to null, and you'll get a null deference when accessing<br>
u.value. Which is not pretty either, since no pointers or references are<br>
apparent in V.value; it's implicit.<br>
<br></div><div class="im">
It seems that the only clean way to do this is to use a class instead of<br>
a struct, since the .init value will conveniently just be null, thereby<br>
sidestepping the problem.<br>
<br>
<br>
T<br>
</div></blockquote>
<br><div class="im">
<br>
        auto func(int x) {<br>
                struct V {<br></div>
                        int value() { return x; }<br>
<br>
                        @property V init() { return this; }<div class="im"><br>
                }<br>
<br>
                return V();<br>
        }<br>
        auto v = func(123);<br>
        auto u = v.init;        // <-- what happens here?<br></div>
        auto x = u.value;<br>
        writeln(x);<br>
<br>
If you add an init property then it is not null. I'm not sure if this is the correct behavior as I just jumped into this discussion and I'm not sure if I understand exactly what the problem with these types of structs are. (as far as I can tell they simply let you pass "sets" of data from a function rather easily while also keeping the details hidden(impossible to directly instantiate the struct since it is hidden inside the func)<br>

<br>
In any case, when stepping through the code above, I noticed that init being called but resulting in u.value throwing a null exception. so I added an init property to V and then got the expected behavior. Probably too easy to be the correct solution but who knows ;)<br>

</blockquote></div><br></div>