Express "Class argument may not be null" ?

Johan Engelen via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 8 12:54:04 PDT 2017


On Tuesday, 8 August 2017 at 18:57:48 UTC, Steven Schveighoffer 
wrote:
> On 8/8/17 2:34 PM, Johan Engelen wrote:
>> Hi all,
>>    How would you express the function interface intent that a 
>> reference to a class may not be null?
>> For a function "void foo(Klass)", calling "foo(null)" is 
>> valid. How do I express that that is invalid? (let's leave 
>> erroring with a compile error aside for now)
>
> There isn't a way to do this in the type itself.
>
> One can always create a null class instance via:
>
> MyObj obj;
>
> There is no way to disallow this somehow in the definition of 
> MyObj. With structs, you can @disable this(), and it's still 
> possible but harder to do so.

Ok thanks, so this could be a reason for not being allowed to 
express the non-null-ness.
(I still haven't found peace with the absence of an explicit * 
for classes)

> I would say, however, that if you wanted to express the 
> *intent*, even without a compile-time error, you could use a 
> contract:
>
> void foo(Klass k) in {assert(k !is null);};

Thanks. I regret leaving compile-time errors out, because in that 
case adding it to the function documentation would suffice.

(Btw: "Error: function foo in and out contracts require function 
body". But who uses .di files anyway. ;-)

Cheers,
   Johan



More information about the Digitalmars-d-learn mailing list