Open question: what code pattern you use usually for null safety problem

ddcovery antoniocabreraperez at gmail.com
Fri Jan 15 00:27:54 UTC 2021


On Thursday, 14 January 2021 at 20:23:08 UTC, Steven 
Schveighoffer wrote:
>
> You could kinda automate it like:
>
> struct NullCheck(T)
> {
>    private T* _val;
>    auto opDispatch(string mem)() if (__traits(hasMember, T, 
> mem)) {
>        alias Ret = typeof(() { return __traits(getMember, 
> *_val, mem); }());
>        if(_val is null) return NullCheck!(Ret)(null);
>        else return NullCheck!(Ret)(__trats(getMember, *_val, 
> mem));
>    }
>
>    bool opCast(V: bool)() { return _val !is null; }
> }
>
> auto nullCheck(T)(T *val) { return AutoNullCheck!T(val);}
>
> // usage
> if(nullCheck(person).father.father && person.father.father.name 
> == "Peter")
>
> Probably doesn't work for many circumstances, and I'm sure I 
> messed something up.
>
> -Steve

I'm seeing "opDispatch" everywhere last days :-). It's really 
powerful!!!

If we define an special T _(){ return _val; } method, then you 
can write

   if( nullCheck(person).father.father.name._ == "Peter")

And renaming

   if( ns(person).father.father.name._ == "Peter" )

And adding some extra check like ** isAssignable!(Ret, 
typeof(null) )** we can add special treatment for not nullable 
types

   if( ns(person).father.father.age._(0) == 92 ){ ... }
   assert( ns(person).father.father.father.age._ == int.init );

If for some strange reason I ever need null safety, I think this 
is the most beautiful solution or at least a great lesson on 
templates.

Thanks a lot for the lesson, Steve



More information about the Digitalmars-d-learn mailing list