Delegate function access to classes local variable

Colin Grogan grogan.colin at gmail.com
Fri Nov 8 05:19:04 PST 2013


On Friday, 8 November 2013 at 13:14:33 UTC, Timon Gehr wrote:
> 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);
>     }
> }


Ah, brilliant! I like that construct.
Thank you!


More information about the Digitalmars-d-learn mailing list