Func Param Confusion - in/out/inout/ref/const/immutable
Ali Çehreli
acehreli at yahoo.com
Fri Feb 22 11:32:43 PST 2013
On 02/22/2013 11:19 AM, Zane wrote:
> When is it appropriate to use in, out, inout, ref, immutable, and const
> in function parameters? I read the documentation and understand the
> basics behind them, but I'm a little confused, for example,
You are not alone. :)
> why someone would want to use 'out' instead of 'ref'
There is an idiom in C where a function first sets its "out parameter"
to null (or another initial value) and then does some more work to fill
that to actual result of the function:
int make_something(Something ** p)
{
int err = 0;
assert(p);
*p = NULL; // first, initialize
// fill in p later on
return err;
}
To me, 'out' of D does that initialization automatically.
> why 'in' instead of 'const',
'in' is nothing but 'const scope'. As scope is not implemented yet, in
and const feel the same.
> or why 'immutable' instead of 'const'?
There is a very big semantic difference between those two:
const can take mutable, const, and immutable. In that sense, it is
"welcoming."
immutable is demanding: It wants immutable perhaps because the immutable
data will be stored for later use. An alternative for the function is to
take const and then to make an immutable copy but that is sometimes
wasteful.
If the function communicates its need to the caller, the caller hands
over the immutable data, if the data is immutable to begin with. No copy
needed in that case. Of course the caller may need to make an immutable
copy from mutable data, but again, that copy is not wasted. Further, the
caller may call assumeUnique to convert mutable data to immutable.
> If 'inout' is used as a wildcard,
> allowing for any of several storage classes, why is it needed at all
> (wouldn't 'ref' work?).
inout can transfer that information to the return type:
inout(Something) foo(inout(Something) parameter)
{
// ...
}
> The more I think I get it, the more I end up
> getting confused. Am I thinking about this too hard? FYI: I come from
> primarily a C/Java/PHP background, so these concepts are relatively new
> to me - it feels excessive, though I am willing to learn.
I have tried to capture most of these concepts in the following chapters:
http://ddili.org/ders/d.en/const_and_immutable.html
http://ddili.org/ders/d.en/function_parameters.html
http://ddili.org/ders/d.en/const_member_functions.html
Ali
--
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
More information about the Digitalmars-d-learn
mailing list