On 15/01/12 3:19 PM, dsimcha wrote:
On 1/15/2012 8:36 AM, Alex Rønne Petersen wrote:
Hi,

I don't know how many times I've made the mistake of passing a local
variable to a function which takes a 'ref' parameter. Suddenly, local
variables/fields are just mutating out of nowhere, because it's not at
all obvious that a function you're calling is taking a 'ref' parameter.
This is particularly true for std.utf.decode().

Yes, I realize I could look at the function declaration. Yes, I could
read the docs too. But that doesn't prevent me from forgetting that a
function takes a 'ref' parameter, and then doing the mistake again. The
damage is done, and the time is wasted.

I think D should allow 'ref' on call sites to prevent these mistakes.
For example:

string str = ...;
size_t pos;
auto chr = std.utf.decode(str, ref pos);

Now it's much more obvious that the parameter is passed by reference and
is going to be mutated.

Ideally, this would not be optional, but rather *required*, but I
realize that such a change would break a *lot* of code, so that's
probably not a good idea.

Thoughts?


This would break UFCS severely. The following would no longer work:

auto arr = [1, 2, 3, 4, 5];
arr.popFront(); // popFront takes arr by ref

Unless it was ignored for UFCS, which is reasonable, since foo.bar() looks like it could modify foo whereas bar(foo) doesn't in general.

Reply via email to