User defined attributes use
Namespace
rswhite4 at googlemail.com
Mon Sep 16 11:56:17 PDT 2013
On Monday, 16 September 2013 at 17:50:16 UTC, Maxim Fomin wrote:
> On Monday, 16 September 2013 at 16:50:43 UTC, Namespace wrote:
>> On Monday, 16 September 2013 at 15:47:36 UTC, ilya-stromberg
>> wrote:
>>> On Monday, 16 September 2013 at 15:12:05 UTC, Maxim Fomin
>>> wrote:
>>>> On Monday, 16 September 2013 at 10:29:12 UTC, matovitch
>>>> wrote:
>>>>> All your examples are great, thank you ! Is there a way to
>>>>> omit validate such that the compiler would call it
>>>>> implicitly ?
>>>>>
>>>>> For example :
>>>>>
>>>>> class C {
>>>>> ...
>>>>> }
>>>>>
>>>>> void fun(@nonNull C c) {
>>>>> ...
>>>>> };
>>>>>
>>>>> C c;
>>>>> fun(c); //compilation error since C is null
>>>>
>>>> No, this isn't doable with UDAs because what you want
>>>> requires runtime check. It is doable using other language
>>>> features.
>>>
>>> It's intresting how can I check that pointer is not null at
>>> the compile time. Can you print a example, please?
>>> I know that we can use contract programming, but it requires
>>> runtime check.
>>
>> That isn't possible. ;)
>
> Similar effect can be achieved by different way. If some
> function takes S as parameter, one cannot pass directly
> instance of A or null - error will be issued which is some sort
> of compile-time protection.
>
> class A
> {
> int i;
> }
>
> struct S
> {
> A a;
> A getA()
> {
> if (a is null)
> a = new A;
> return a;
> }
> alias getA this;
> }
>
> void main()
> {
> S s;
> assert (s.i is 0);
> S ss = S.init;
> assert (ss.i is 0);
> }
>
> Unfortunately D does not have non-nullable classes which is a
> problem #1. Ideally structs should have default constructors
> (hello to those who miss them - problem #2) which could
> initialize class instance. Since they are absent, wrapping
> struct can be enhanced by inserting disabled constructor to
> ensure that no default struct instances with null references
> are created. However, since disabled constructors are also
> flawed (they don't prevent from producing T.init values by
> design and in some situations dmd is not smart enough to detect
> other cases by mistake) which is a problem #3, non-null classes
> can be simulated by code above using alias this + rt check. At
> least this works with two most problematic cases of struct
> initilialization: without initializer and with T.init value.
Yes, I know. Search for my name and not null, you will find many
topics.
I hate this NotNull struct hack. It is the same crap as the
current scope solution. BTW: I'm curious which built-in feature
will be removed next, maybe AA?
An annotation like Foo! f would be much nicer than NotNull!Foo or
@NotNull Foo, but it would be an agreement.
And I agree absolute, to disable default CTor's by struct's was a
huge mistake. But D is full of those. ;)
More information about the Digitalmars-d-learn
mailing list