digitalmars.D - UDAs and no complaints about "need 'this'"
- John Colvin (19/19) Apr 09 2015 struct BigLongStructName
- jkpl (21/40) Apr 09 2015 I think it's an error. When the attribute is a struct, it looks
- Maxim Fomin (12/31) Apr 09 2015 For me it seems to fit into D type system (which is not
struct BigLongStructName { int evenLongerMemberName; } struct QN{} unittest { BigLongStructName bigLongStructName; (bigLongStructName.evenLongerMemberName) QN quickName; __traits(getAttributes, quickName)[0]++; } Is it just me or is it weird that this works? Once you pull the UDA out from being a storage class and attempt to alias it, you get the usual "need 'this' for 'evenLongerMemberName' of type 'int'" error messages on use. Why are UDAs so special? I don't believe there's any other way to achieve this sort of effective renaming.
Apr 09 2015
On Thursday, 9 April 2015 at 09:53:15 UTC, John Colvin wrote:struct BigLongStructName { int evenLongerMemberName; } struct QN{} unittest { BigLongStructName bigLongStructName; (bigLongStructName.evenLongerMemberName) QN quickName; __traits(getAttributes, quickName)[0]++; } Is it just me or is it weird that this works? Once you pull the UDA out from being a storage class and attempt to alias it, you get the usual "need 'this' for 'evenLongerMemberName' of type 'int'" error messages on use. Why are UDAs so special? I don't believe there's any other way to achieve this sort of effective renaming.I think it's an error. When the attribute is a struct, it looks like the member is processed as a static variable. But the equivalent with a class raises an AV: --- class BigLongStructName { int evenLongerMemberName; } struct QN{} unittest { import std.stdio; BigLongStructName bigLongStructName; (bigLongStructName.evenLongerMemberName) QN quickName; __traits(getAttributes, quickName)[0]++; } --- which is a totally expected behaviour.
Apr 09 2015
On Thursday, 9 April 2015 at 09:53:15 UTC, John Colvin wrote:struct BigLongStructName { int evenLongerMemberName; } struct QN{} unittest { BigLongStructName bigLongStructName; (bigLongStructName.evenLongerMemberName) QN quickName; __traits(getAttributes, quickName)[0]++; } Is it just me or is it weird that this works? Once you pull the UDA out from being a storage class and attempt to alias it, you get the usual "need 'this' for 'evenLongerMemberName' of type 'int'" error messages on use. Why are UDAs so special? I don't believe there's any other way to achieve this sort of effective renaming.For me it seems to fit into D type system (which is not necessarily is a good idea). struct S { int i; } alias S.i si; void main(){ /*si++;*/} Behavior of D depends sometimes on it internals, not on programmers' expectations. Since D has never been stabilized, the boundary between WAT and bugs is partially undefined.
Apr 09 2015