digitalmars.D.learn - delegate reference
- Saaa (24/24) Sep 09 2009 abstract class C
- Daniel Keep (2/26) Sep 09 2009 Because you didn't reassign deleg.
- Saaa (3/29) Sep 09 2009 but isn't deleg pointing to c's method?
- Daniel Keep (4/34) Sep 09 2009 Yes... just because you change what c points to doesn't magically
- Saaa (9/43) Sep 09 2009 deleg points to c and c points to c2 and later to c3 while deleg still p...
- BCS (3/48) Sep 09 2009 deleg dosn't have pointer to c, it has a pointer to an object, that is a...
- Ary Borenszweig (16/46) Sep 09 2009 c --> c2.method
- Saaa (4/50) Sep 09 2009 Ok, disregard my last comment :D
abstract class C { int method(); } class C2:C { int method() return 2; } class C3:C { int method() return 3; } int delegate() deleg; void main() { C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; deleg = &c.method; writefln(deleg()); // 2 c=c3; writefln(deleg()); // 2 // I expected this to write 3, why is this not so?
Sep 09 2009
Saaa wrote:abstract class C { int method(); } class C2:C { int method() return 2; } class C3:C { int method() return 3; } int delegate() deleg; void main() { C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; deleg = &c.method; writefln(deleg()); // 2 c=c3; writefln(deleg()); // 2 // I expected this to write 3, why is this not so?Because you didn't reassign deleg.
Sep 09 2009
"Daniel Keep" <daniel.keep.lists gmail.com> wrote in message news:h88cck$1orc$1 digitalmars.com...Saaa wrote:but isn't deleg pointing to c's method?abstract class C { int method(); } class C2:C { int method() return 2; } class C3:C { int method() return 3; } int delegate() deleg; void main() { C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; deleg = &c.method; writefln(deleg()); // 2 c=c3; writefln(deleg()); // 2 // I expected this to write 3, why is this not so?Because you didn't reassign deleg.
Sep 09 2009
Saaa wrote:"Daniel Keep" <daniel.keep.lists gmail.com> wrote in message news:h88cck$1orc$1 digitalmars.com...Yes... just because you change what c points to doesn't magically rewrite all other references. You might want to read http://digitalmars.com/d/1.0/type.html#delegatesSaaa wrote:but isn't deleg pointing to c's method?abstract class C { int method(); } class C2:C { int method() return 2; } class C3:C { int method() return 3; } int delegate() deleg; void main() { C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; deleg = &c.method; writefln(deleg()); // 2 c=c3; writefln(deleg()); // 2 // I expected this to write 3, why is this not so?Because you didn't reassign deleg.
Sep 09 2009
"Daniel Keep" <daniel.keep.lists gmail.com> wrote in message news:h88i4n$235l$1 digitalmars.com...Saaa wrote:deleg points to c and c points to c2 and later to c3 while deleg still point to c. Thus when calling deleg it points to c which now points to c3, thus writing '3'. maybe I don't understand what "C c;" and "c=c3;" does? Isn't c a pointer to a C object?"Daniel Keep" <daniel.keep.lists gmail.com> wrote in message news:h88cck$1orc$1 digitalmars.com...Yes... just because you change what c points to doesn't magically rewrite all other references.Saaa wrote:but isn't deleg pointing to c's method?abstract class C { int method(); } class C2:C { int method() return 2; } class C3:C { int method() return 3; } int delegate() deleg; void main() { C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; deleg = &c.method; writefln(deleg()); // 2 c=c3; writefln(deleg()); // 2 // I expected this to write 3, why is this not so?Because you didn't reassign deleg.You might want to read http://digitalmars.com/d/1.0/type.html#delegatesI've read that one a few times now :D
Sep 09 2009
Hello Saaa,"Daniel Keep" <daniel.keep.lists gmail.com> wrote in message news:h88i4n$235l$1 digitalmars.com...deleg dosn't have pointer to c, it has a pointer to an object, that is a /copy/ of the reference c.Saaa wrote:deleg points to c and c points to c2 and later to c3 while deleg still point to c. Thus when calling deleg it points to c which now points to c3, thus writing '3'."Daniel Keep" <daniel.keep.lists gmail.com> wrote in message news:h88cck$1orc$1 digitalmars.com...Yes... just because you change what c points to doesn't magically rewrite all other references.Saaa wrote:but isn't deleg pointing to c's method?abstract class C { int method(); } class C2:C { int method() return 2; } class C3:C { int method() return 3; } int delegate() deleg; void main() { C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; deleg = &c.method; writefln(deleg()); // 2 c=c3; writefln(deleg()); // 2 // I expected this to write 3, why is this not so?Because you didn't reassign deleg.
Sep 09 2009
Saaa wrote:"Daniel Keep" <daniel.keep.lists gmail.com> wrote in message news:h88cck$1orc$1 digitalmars.com...c --> c2.method ^ | deleg ---Saaa wrote:abstract class C { int method(); } class C2:C { int method() return 2; } class C3:C { int method() return 3; } int delegate() deleg; void main() { C c; C2 c2 = new C2; C3 c3 = new C3; c=c2;Now: c --> c3.method c2.method ^ | deleg ---deleg = &c.method; writefln(deleg()); // 2 c=c3;Yes, to previous c's method. See above. Remember that a delegate is a pair: an instance and it's method. You can't just point to a class' method, you are always pointing to a instance's method. (that's why my arrows point to the dot :-P)but isn't deleg pointing to c's method?writefln(deleg()); // 2 // I expected this to write 3, why is this not so?Because you didn't reassign deleg.
Sep 09 2009
"Ary Borenszweig" <ary esperanto.org.ar> wrote in message news:h88i6o$23hh$1 digitalmars.com...Saaa wrote:Ok, disregard my last comment :D How should I do this then?"Daniel Keep" <daniel.keep.lists gmail.com> wrote in message news:h88cck$1orc$1 digitalmars.com...c --> c2.method ^ | deleg ---Saaa wrote:abstract class C { int method(); } class C2:C { int method() return 2; } class C3:C { int method() return 3; } int delegate() deleg; void main() { C c; C2 c2 = new C2; C3 c3 = new C3; c=c2;Now: c --> c3.method c2.method ^ | deleg ---deleg = &c.method; writefln(deleg()); // 2 c=c3;Yes, to previous c's method. See above. Remember that a delegate is a pair: an instance and it's method. You can't just point to a class' method, you are always pointing to a instance's method. (that's why my arrows point to the dot :-P)but isn't deleg pointing to c's method?writefln(deleg()); // 2 // I expected this to write 3, why is this not so?Because you didn't reassign deleg.
Sep 09 2009
Saaa wrote:Ok, disregard my last comment :D How should I do this then?class Foo { C* c; this(ref C c) { this.c = &c; } int invoke() { return (*c).method(); } } void main() { // ... deleg = &(new Foo(c)).invoke; } Or something similar. This is dangerous. Do not allow either the Foo instance or the delegate to survive past the end of c's scope. It is simpler and safer to just update the delegate.
Sep 09 2009
class Foo { C* c; this(ref C c) { this.c = &c; } int invoke() { return (*c).method(); } } void main() { // ... deleg = &(new Foo(c)).invoke; } Or something similar. This is dangerous. Do not allow either the Foo instance or the delegate to survive past the end of c's scope. It is simpler and safer to just update the delegate.Thanks!
Sep 09 2009
Hello Saaa,How should I do this then?C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; auto dg = { return c.method(); }; c=c3;
Sep 09 2009
Hello Saaa,I actually did it like this before :) Thanks But like this I need to do the "c is null" checking within the function literal. I'm not sure how these function literals are implemented; will the size of the function have any impact on speed? Or does the compiler handle them like any other function and just thinks of a name itself ?How should I do this then?C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; auto dg = { return c.method(); }; c=c3;
Sep 09 2009
Hello Saaa,No more than with normal functions.Hello Saaa,I actually did it like this before :) Thanks But like this I need to do the "c is null" checking within the function literal. I'm not sure how these function literals are implemented; will the size of the function have any impact on speed?How should I do this then?C c; C2 c2 = new C2; C3 c3 = new C3; c=c2; auto dg = { return c.method(); }; c=c3;Or does the compiler handle them like any other function and just thinks of a name itself ?Exactly. If you compile with DMD and the -v flag you can see what names it gives them.
Sep 09 2009
:) nice Thanks!Or does the compiler handle them like any other function and just thinks of a name itself ?Exactly. If you compile with DMD and the -v flag you can see what names it gives them.
Sep 09 2009