digitalmars.D.learn - Get identifier of "this"
- Andre (19/19) Sep 17 2012 Hi,
- Andrej Mitrovic (26/36) Sep 17 2012 You can't really get that info at runtime, a class object isn't bound
- Steven Schveighoffer (4/6) Sep 17 2012 Please file, ICE should never occur.
- Andrej Mitrovic (4/5) Sep 17 2012 You're bound to find a small million of these when it comes to typos
- Andre (8/15) Sep 17 2012 ...
- Jonathan M Davis (8/30) Sep 17 2012 No. It's not possible. __traits is a compile-time construct, and Bank's
Hi, assuming I have following constuct: public class Bank{ public enum test() { return "writeln(\""~__traits(identfier, this)~"\");"; } } public static void main(){ Bank b = new Bank; mixin(b.test()); } During compile time, following code should be generated: writeln("b"); Is this possible? For the demo coding I receive the error, that "this" has no identifier. Kind regards Andre
Sep 17 2012
On 9/17/12, Andre <andre s-e-a-p.de> wrote:Get identifier of "this"You can't really get that info at runtime, a class object isn't bound to a name, 'this' has no identifier. Symbols (like variables) have identifiers, not objects.public class Bank{Unnecessary, declarations are public by default.public enum test()'enum' has no meaning in a return type. Either it's 'auto' which infers the return type from the function body, or it's a specific type like 'string' (or void if no return type).{ return "writeln(\""~__traits(identfier, this)~"\");";typo: identifier, not identfier} }public static void main(){public and static have no meaning here.During compile time, following code should be generated: writeln("b");It's not possible to mixin a string at compile-time from a string returned from a method of an object which is instantiated at runtime. If you want the identifier of the variable then you don't have to deal with the 'this' reference at all, e.g.: property string test(alias symb)() { return "writeln(\"" ~ __traits(identifier, symb) ~ "\");"; } class Bank { } void main() { Bank b = new Bank; mixin(test!b); } Your original sample does cause a compiler ICE but I don't know if it's worth filing since the code was invalid.
Sep 17 2012
On Mon, 17 Sep 2012 14:01:35 -0400, Andrej Mitrovic <andrej.mitrovich gmail.com> wrote:Your original sample does cause a compiler ICE but I don't know if it's worth filing since the code was invalid.Please file, ICE should never occur. -Steve
Sep 17 2012
On 9/17/12, Steven Schveighoffer <schveiguy yahoo.com> wrote:Please file, ICE should never occur.You're bound to find a small million of these when it comes to typos in templates. :) http://d.puremagic.com/issues/show_bug.cgi?id=8679
Sep 17 2012
On Monday, 17 September 2012 at 18:01:02 UTC, Andrej Mitrovic wrote:On 9/17/12, Andre <andre s-e-a-p.de> wrote:... Hi Andrej, thanks a lot for the working sample coding, this helps me. Kind regards AndreGet identifier of "this"You can't really get that info at runtime, a class object isn't bound to a name, 'this' has no identifier. Symbols (like variables) have identifiers, not objects.
Sep 17 2012
On Monday, September 17, 2012 19:43:24 Andre wrote:Hi, assuming I have following constuct: public class Bank{ public enum test() { return "writeln(\""~__traits(identfier, this)~"\");"; } } public static void main(){ Bank b = new Bank; mixin(b.test()); } During compile time, following code should be generated: writeln("b"); Is this possible? For the demo coding I receive the error, that "this" has no identifier.No. It's not possible. __traits is a compile-time construct, and Bank's definition knows nothing about any variables of type Bank declared elsewhere. Heck, the code for Bank could be compiled months before the code with b in it is even written (and then has the code with Bank linked to it when it's compiled). So no, it can't know about b, and what you're trying to do won't work. - Jonathan M Davis
Sep 17 2012