On Sun, Jul 13, 2014 at 02:39:00AM +0000, dysmondad via Digitalmars-d-learn wrote: > On Saturday, 12 July 2014 at 05:23:29 UTC, Ali Çehreli wrote: > >On 07/11/2014 10:08 PM, dysmondad wrote: > > > >> class Velocity > >> { > > > >[...] > > > >> ref Velocity opOpAssign(string op) ( in float multiplier > >) > > > >Unrelated to your question, you want to return just Velocity there. > >Unlike C++, classes are reference types in D. So, Velocity itself is > >essentially a Velocity* in C++. > > > >Ali > > Right you are. I knew that but it still didn't translate into code. > Thank you for pointing that out. I guess eventually I will remember > that class variables are pointers. > > As a point of curiosity, is the ref keyword in this case simply > redundant or does it actually make a difference?
ref makes it possible for the caller to modify the pointer returned by the callee. For example: class D { int x; } class C { D d; this(D _d) { d = _d; } ref D getPtr() { return d; } } auto d1 = new D; auto d2 = new D; auto c = new C(d1); // c.d now points to d1 assert(c.getPtr() is d1); // getPtr returns d1 c.getPtr() = d2; // this modifies c.d assert(c.getPtr() is d2); // getPtr now returns d2 If you do not wish the caller to do this, remove the ref from the function signature. T -- Don't drink and derive. Alcohol and algebra don't mix.