Passing arguments into functions - in, out, inout, const, and contracts

Kirk McDonald kirklin.mcdonald at gmail.com
Sat Feb 10 22:24:58 PST 2007


Jason House wrote:
> I believe that everything (except maybe fundamental types such as int) 
> are passed by reference.  I'd expect "in" parameters to be considered 
> const, but I know that member functions can't be declared const.
> 

No. This is precisely backwards. Everything is passed by value, except 
for certain high-level types like classes and arrays. Even then, 
in/out/inout still controls whether the function can reassign the reference.

> It seems to me that in/out/inout has no effect on how the language 
> operates.  I'm wondering how those affect the language.  Does "in" 
> impose a contract that the ending value must equal the starting value? I 
> also haven't thought of any good way to differentiate out from inout 
> from the compiler's standpoint (obviously, it makes sense to users).

Take the following code:

import std.stdio : writefln;

class Foo {
     int i;
     this(int i) { this.i = i; }
}

void func1(Foo f) {
     f = new Foo(100);
}
void func2(Foo f) {
     f.i = 30;
}
void func3(inout Foo f) {
     f = new Foo(200);
}
void func4(int i) {
     i = 20;
}
void func5(inout int i) {
     i = 25;
}

void main() {
     int i, j;
     Foo a, b, c;
     a = new Foo(1);
     b = new Foo(2);
     c = new Foo(3);

     func1(a);
     writefln(a.i); // Prints 1. The reference was passed 'in', so the
                    // function does not change it.
     func2(b);
     writefln(b.i); // Prints 30. The object was passed by reference,
                    // and the function mutated it.
     func3(c);
     writefln(c.i); // Prints 200. The reference was passed 'inout',
                    // so the function does change it.
     func4(i);
     writefln(i); // Prints 0. The int was passed 'in'.
     func5(j);
     writefln(j); // Prints 25. The int was passed 'inout'.
}

-- 
Kirk McDonald
http://kirkmcdonald.blogspot.com
Pyd: Connecting D and Python
http://pyd.dsource.org


More information about the Digitalmars-d-learn mailing list