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