Delegate function access to classes local variable

Timon Gehr timon.gehr at gmx.ch
Fri Nov 8 05:14:32 PST 2013


On 11/08/2013 01:43 PM, Colin Grogan wrote:
> Hi folks,
>
> I'm having some issue getting a delegate function access to a classes
> member variable.
>
> At object construct time, I'm passing in a delegate function, and a list
> of parameters after.
> The parameters are saved to a variable called vars.
> Should I then not be able to access that vars variable from inside my
> delegate function?
>
> I guess some code is a better explanation:
> import std.stdio;
> void main()
> {
>      Column!string col1 = new Column!string( {return "test"; }, "Hello, ");
>      Column!string col2 = new Column!string( {return vars[0]; },
> "World"); // Compilation fail!! Delegate cant see vars[0]

It is not even in scope here.

>      writef("%s", col1.nextValue);
>      writefln("%s", col2.nextValue);
> // I want it to print "Hello, World" here
> }
>
> public class Column(Vars...){
>      private Vars vars;
>      public string delegate() func;
>
>      public this(string delegate() func, Vars vars){
>          this.vars = vars;
>          this.func = func;
>      }
>
>      public string nextValue(){
>          return this.func();
>      }
> }
>
>
> The compilation error is:
> source/app.d(5): Error: undefined identifier vars
>
> This has been wrecking my head for a couple days now, I'm half way
> resigned to the fact it cant work but said I'd ask here to be sure.
>
> Thanks!

import std.stdio;
void main(){
     Column!string col1 = new Column!string((ref m)=>"Hello, ", "test");
     Column!string col2 = new Column!string((ref m)=>m.vars[0], "World");
     writef("%s", col1.nextValue);
     writefln("%s", col2.nextValue);
}

public class Column(Vars...){
     struct Members{ Vars vars; }
     private Members members;
     alias members this;
     string delegate(ref Members) func;

     this(string delegate(ref Members) func, Vars vars){
         this.vars = vars;
         this.func = func;
     }

     string nextValue(){
         return func(members);
     }
}



More information about the Digitalmars-d-learn mailing list