Using "in/out/ref"
David Ferenczi
raggae at ferenczi.net
Wed Jun 18 02:30:51 PDT 2008
Robert Fraser wrote:
> 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"
> }
Thank you very much! Now I understand. :-)
More information about the Digitalmars-d-learn
mailing list