On Friday, 24 January 2014 at 01:26:06 UTC, Ali Çehreli wrote:
On 01/23/2014 07:26 AM, Chris wrote:
> On Thursday, 23 January 2014 at 15:24:19 UTC, Chris wrote:
>> Here's what I'm trying to do.
>>
>> struct Element(T) {
>> T x;
>> T y;
>>
>> public void setX(T value) {
>> x = value;
>> }
>> // More fancy functions ...
>> }
>>
>> I store Element(s) in an array and want to pass each one by
reference,
>> which does not work.
>>
>>
>> class Tree {
>>
>> Element!string[] elements;
>>
>> public ref auto createElement(string name) {
>> elements ~= Element!string(name);
>> return elements[$-1];
>> }
>> }
>>
>> in main:
>>
>> auto tag = Element!string("first");
>>
>> The elements in Tree.elements and the ones in main are not
the same,
>> instead I obtain a copy of each.
>> How can I make them refer to the same Elements? If I have to
add a
>> .ptr property to Element, how do I do that? Is that possible
at all or
>> did I shoot myself in the foot with the template?
>
> Sorry in main it is:
>
> auto tree = new Tree();
> auto tag = tree.createElement("first");
createElement does return a reference. However, because D does
not have local references the type of tag is Element!string
(not 'ref Element!string').
The following program demonstrates that the address of the
returned reference is indeed the same as the one that has been
created:
import std.stdio;
struct Element(T) {
T x;
T y;
public void setX(T value) {
x = value;
}
// More fancy functions ...
}
class Tree {
Element!string[] elements;
public ref auto createElement(string name) {
elements ~= Element!string(name);
writefln(" created element at %s", &elements[$-1]);
return elements[$-1];
}
}
void main()
{
auto tree = new Tree();
writefln("received element at %s",
&tree.createElement("first"));
}
Sample output:
created element at 7F14C72C0F80
received element at 7F14C72C0F80
You can use the returned element directly as well:
tree.createElement("second").setX("hello");
Ali
Thank you guys. Yes, it's the array bit that kills the reference
as FreeSlave pointed out. After tinkering around with it, I've
(reluctantly) turned Element into a class to get the reference
semantics. I need a reference so I can do things like
tree.getElementById("div");
It's a basic (very simple) HTML / markup thing. Tree stores all
elements, but the elements are changed outside Tree, like so
auto div = tree.createElement("div");
div.setAttribute("id", "1");
// ...
div.appendChild(...);
etc.
I'm sure there are cleverer ways of implementing a HTML tree.