On Tuesday, 12 January 2021 at 21:37:11 UTC, Jack wrote:
I was looking for a way to avoid null checks everywhere. I was checking the Null object pattern, or use something like enforce pattern, or even if I could make a new operator and implement something like C#'s .? operator, that Java was going to have one but they refused[1] (doesn't behave exactly as C#'s actually), Kotlin also got something in this area[2]

What some D ways to avoid those checks?

[1]: https://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000047.html [2]: https://kotlinlang.org/docs/reference/null-safety.html#safe-calls

Personally, I really like functional orientation (MayBe, None, Some... and pattern matching) avoiding the use of null, but D is a "system" language compatible with C and null is mandatory.

Some months ago I wrote an utility template to simulate the ?. mechanism.


The resulting syntax:

  class Person
  {
    string name;
    Person father;

    this(string name, Person father){   
      this.name=name;
      this.father=father;
    }
  }

 Person p = new Person("Peter", new Person("John", null));
 assert( p.d!"father".d!"father".d!"name".get is null);
 assert( p.d!"father".d!"name".get == "John");
 assert( p.d!"father".d!"name".d!"length".get(0) == 4);
 assert( p.d!"father".d!"father".d!"name".d!"length".get(0) == 0);
assert( (cast(Person) null).d!"father".d!"father".d!"father".get is null);


That is a "compact" version of a first solution using lambdas

assert( dot(p).dot(a=>a.father).dot(a=>a.father).dot(a=>a.name).dot(a=>a.length).get(0) == 0);

Find more details here:

https://run.dlang.io/gist/392c06e745d1a35df71084ce4d29fed7

Reply via email to