digitalmars.D.learn - usage of ref foreach with variadic functions fails with "cannot be
- error (15/15) Feb 11 2017 I'm making a serializer that has a variadic write method that
- rikki cattermole (5/20) Feb 11 2017 Try:
- error (6/10) Feb 11 2017 Perfect! Thanks so much - I wish that hint was in the
- Michael Coulombe (22/33) Feb 11 2017 Do you have a complete code example that gives your error? I
- error (8/29) Feb 12 2017 Oh... That's really strange; I've updated my code to use non
I'm making a serializer that has a variadic write method that
takes arbitrary params
and serializes them; I want to do the same thing with a read
method ( pass in your
params by ref, and it populates them with data ) - however, I
run into a compiler
error - "cannot be ref" in the foreach statement... Anyone know
a workaround for this? Is this a bug, or by design?
Simplified example:
void populateVars(T...)(T vars){
// Generates "cannot be ref" compiler error:
foreach(ref v; vars){
// Populate v with some data here...
}
}
Feb 11 2017
On 12/02/2017 3:41 AM, error wrote:
I'm making a serializer that has a variadic write method that takes
arbitrary params
and serializes them; I want to do the same thing with a read method (
pass in your
params by ref, and it populates them with data ) - however, I run into
a compiler
error - "cannot be ref" in the foreach statement... Anyone know a
workaround for this? Is this a bug, or by design?
Simplified example:
void populateVars(T...)(T vars){
// Generates "cannot be ref" compiler error:
foreach(ref v; vars){
// Populate v with some data here...
}
}
Try:
foreach(i, v; vars) {
vars[i] = ...;
}
Feb 11 2017
On Saturday, 11 February 2017 at 14:43:18 UTC, rikki cattermole
wrote:
Try:
foreach(i, v; vars) {
vars[i] = ...;
}
Perfect! Thanks so much - I wish that hint was in the
documentation for variadic functions, although I guess it
suggests an inefficiency in the compiler - since there would be
an additional copy of vars[i] created in v.
Feb 11 2017
On Saturday, 11 February 2017 at 15:02:11 UTC, error wrote:On Saturday, 11 February 2017 at 14:43:18 UTC, rikki cattermole wrote:Do you have a complete code example that gives your error? I can't reproduce it (DMD v2.073.0): int foo(T...)(T vars) { int i = 0; foreach(ref v ; vars) { v = 5; i += v; } return i; } void bar(T...)(ref T vars) { foreach(ref v ; vars) { v = 3; } } void main() { import std.stdio; int x = 7; bar(x); writeln(foo(4,x,8.2)); // 15, no errors }Try: foreach(i, v; vars) { vars[i] = ...; }Perfect! Thanks so much - I wish that hint was in the documentation for variadic functions, although I guess it suggests an inefficiency in the compiler - since there would be an additional copy of vars[i] created in v.
Feb 11 2017
On Sunday, 12 February 2017 at 03:34:19 UTC, Michael Coulombe
wrote:
Do you have a complete code example that gives your error? I
can't reproduce it (DMD v2.073.0):
int foo(T...)(T vars) {
int i = 0;
foreach(ref v ; vars) {
v = 5;
i += v;
}
return i;
}
void bar(T...)(ref T vars) {
foreach(ref v ; vars) {
v = 3;
}
}
void main() {
import std.stdio;
int x = 7;
bar(x);
writeln(foo(4,x,8.2)); // 15, no errors
}
Oh... That's really strange; I've updated my code to use non
indexed foreach, and it's now building without the error... I
have absolutely no idea what caused the error to occur. I've
also tried reverting to earlier versions of the project, and I
can't recreate the issue. If it occurs again, I'll snapshot the
project and try to make a repeatable set up.
Feb 12 2017








error <error n.com>