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









"jkpl" <jkpl nowhere.fr> 