Delegates and classes for custom code.
arturg
var.spool.mail700 at gmail.com
Wed Apr 18 01:58:40 UTC 2018
On Wednesday, 18 April 2018 at 01:12:33 UTC, Chris Katko wrote:
> That was all pseudo-code typed by hand.
>
> I got my code to work today. I don't know if it's the prettiest
> it can be, but it works:
>
> // TESTING ACCESS TO the OWNING function
> //-------------------------------------------
> class test_window
> {
> float x;
> float y;
>
> void draw_text(string text)
> {
> writeln(text);
> }
>
> this( void function(test_window) onDraw )
> {
> this.onDraw = onDraw;
> }
>
> void run() //called every frame
> {
> onDraw(this);
> }
>
> void function (test_window) onDraw;
> }
>
>
> void test_dialog()
> {
> auto t = new test_window(function void(test_window ptr)
> {
> with(ptr)
> {
> draw_text( format("Hello, world. [x,y]=[%f,%f]", x, y));
> }
> });
>
> t.run();
> }
>
>
>
>
>
> And a second attempt/version:
>
>
>
>
>
> // TESTING ACCESS to anything
> // ----------------------------------------------------------
>
> struct data_to_access_t
> {
> int tacos;
> }
>
> struct data_to_access2_t
> {
> struct beans
> {
> int x;
> };
>
> beans b;
> }
>
> class abc(T)
> {
> int x;
> void delegate(T) run_delegate;
>
> T data;
>
> this(T t, void delegate(T) d)
> {
> data = t;
> run_delegate = d;
> }
>
> void execute()
> {
> run_delegate(data);
> }
> }
>
> void test_dialog_anything()
> {
> data_to_access_t d;
> data_to_access2_t d2;
> d.tacos = 4;
> d2.b.x = 5;
>
> auto x = new abc!data_to_access_t ( d, (d) => writefln("test
> %d", d.tacos) );
> auto y = new abc!data_to_access_t ( d, (d){writefln("test
> %d", d.tacos);} );
> auto z = new abc!data_to_access2_t(d2, delegate void
> (d2){writefln("test2 %d", d2.b.x);} );
>
> x.execute();
> y.execute();
> z.execute();
> }
>
>
>
>
>
> My only questions are:
>
> - is there any way to make it "smart" enough to take the type
> of the argument, instead of me manually giving it a type.
>
> auto x = new abc!data_to_access_t ( d, (d) => writefln("test
> %d", d.tacos) );
> becomes
> auto x = new abc( d, (d) => writefln("test %d", d.tacos) );
>
> - Is there any way to eliminate the first d? Which is
> essentially a "this" pointer.
>
> auto x = new abc!data_to_access_t ( d, (d) => writefln("test
> %d", d.tacos) );
> becomes
> auto x = new abc!data_to_access_t ( (d) => writefln("test
> %d", d.tacos) );
>
> - And preferably, if possible, both. But I'll take what I can
> get.
is it this what you want?
class A
{
int a;
void delegate() onDraw;
this(void delegate() dg)
{
onDraw = dg;
}
void drawText(string s)
{
s.writeln;
}
}
void main()
{
A a;
a = new A((){ a.a = 5; a.drawText("test"); "drawing
all".writeln; });
}
but if you do A a = new A((){ a.a = 5; ...});
the dg cant capture 'a' yet.
so maybe it would be better to just do:
A a = new A;
a.onDraw = (){ a.drawText("test"); "draw rest".writeln; };
More information about the Digitalmars-d-learn
mailing list