I thought "this should have zero impact, because in D, because "." is supposed to deference for you if needed."

D can't do this all the time: struct pointer assignment for example, should not automatically cause the corresponding structs to be assigned.

----
struct S
{
  void foo();
}
void bar(S);

void main()
{
  auto r = new S;
  r.foo();
  bar(r);  //derp
  r.bar(); //derp
};
----
I find it strange, because I thought the entire point was to abstract way something was allocated to the way it was used: EG. From a caller perspective, I don't care if r is on the stack or on the heap: I just want to call the method bar on the object in question.

bar(r) would need D to support an implied conversion of S* to S (or to ref S with bar having a reference parameter if you wanted to avoid copying), for this to work.

Converting S* to ref S (without copying) is an interesting idea for D. I wonder what those close to the definition of D and the compiler think of it.

Things get even stranger if you mix in uniform call syntax. "r.foo()" works, but "r.bar()" doesn't?

Am I really forced into:
----
struct S
{
  void foo();
}
void bar(S);
void main()
{
  auto r = new S;
  r.foo();
  bar(*r);    //Groan
  (*r).bar(); //Super Groan.
};
----
I feel as if I'm just back at square 1...

You could fake it: D has 'alias this' which helps a lot.

#!/usr/bin/rdmd

import std.stdio;

struct Sdata {
  int x[10000]; //imagine this inline in the struct
  this(this) { writeln("Copied!"); }
  void foo() { writeln("foo: ", x[99]); }
}

struct S {
  Sdata* ptr;
  alias ptr this;
  this(Sdata* newSdata) { ptr = newSdata; }
}

ref int bar(S s) { s.x[99] = 3142; return s.x[99]; }

void main() {
  auto r = S(new Sdata);
  bar(r);
  writeln("main: ", r.x[99] );
  r.bar = 999;
  writeln("main: ", r.x[99] );
  r.foo();
}


Reply via email to