Using "in/out/ref"

Robert Fraser fraserofthenight at gmail.com
Wed Jun 18 02:07:06 PDT 2008


David Ferenczi wrote:
> I would like to better understand the rationale of in/out/ref keywords, and
> how they should be used.
> 
> If I don't use them, the function gets a mutable copy of the variable. So
> the original variable won't change. At least in case of integral types.
> (C-like convention?) In case of objects (object references?), or pointers
> the function gets a mutable reference or a mutable pointer. This means that
> the function can change the object, which is referred by the pointer or
> reference. Is it right? Does this also mean that in case of objects or
> pointes ref is the default?
> 
> In case of object references I would always use one of the in/out/ref
> keywords to be explicit. (It could be also enforced by the compiler to be
> explicit on references.)
> 
> Please correct me, if I'm wrong.
> 
> Regards,
> David

In the case of objects, "ref" would be "pointer to pointer". So for example:

class C {
     string s;
     this(string s) { this.s = s; }
}


void foo(C c) {
     c.s = "foo1";
     c = new C("foo2"); // Compiles, but doesn't do anything
                        // c is only changed for scope of function
}

void bar(in C c) {
     c.s = "bar1"; // Compile-time error!
     c = new C("bar2"); // Compile-time error!
}

void baz(ref C c) {
     c.s = "baz1";
     c = new C("baz2");
}

void main() {
     C c = new C("main");
     foo(c);
     writefln(c.s); // Writes "foo1"
     baz(c);
     writefln(c.s); // Writes "baz2"
}


More information about the Digitalmars-d-learn mailing list