Comment #0 by jason.james.house — 2007-02-12T21:41:11Z
The description of in/out/inout/lazy leaves much to be desired. There's a thread on the mailing list titled "Passing arguments into functions - in, out, inout, const, and contracts" that has a number of people attempting to give more complete descriptions.
It seems like parameters fall into two categories
Type 1: fundamental types, structs, fixed size arrays
Type 2: variable size arrays, objects
in:
Type 1 - Passed by value. changes to object have no external effect
Type 2 - Passed by reference. function can't change the reference but can change the object
out:
Type 1 - Passed by reference, initialized by default initializer
Type 2 - Passed by reference, initialized by default initializer
inout:
Type 1 - Passed by reference, can change the reference(?)
Type 2 - Passed by reference, can change the reference
To me, the clarification of "in" parameters need clarification. For type 2, I'd expect the equivalant of a C++ "const T&" but that isn't the case and should really be spelled out.
Comment #1 by wbaxter — 2007-02-12T22:01:19Z
Fixed size arrays are also Type 2, passed by reference.
int func(int[2] xy) { xy[0] = 1; } // modifies caller's xy[0]
Comment #2 by github-bugzilla — 2012-01-21T17:17:28Z