On Monday, 14 December 2015 at 13:19:13 UTC, Martin6265 wrote:
I dont said C# is better, just missing some preferred stuffs
from other languages.
`.?` from C# is same thing as message passing in ObjC. (You can
send message to invalid object without accessing null pointer).
And I miss that stuff in D.
Maybe will create a new instance of T if T is null, right?
class Responder {
Responder m_parent;
void SetSomething(int a) {
m_parent.maybe.SetSomething(a);
}
}
So, this example will ends in infinite loop.
But I don't want to call SetSomething on m_parent if m_parent
is null.
Despite the enthusiasm in the aforementioned topic and despite
the obsession that "every other language feature can be
transformed in a D library solution beacuse D is so powerful",
the D monad-like implementation is incomplete and is not
equivalent to the C# ? operator, it wrongly assumes a field as a
result type. Compiling your example, will result in an error
message - "no field SetSomething for Maybe" (or similar).
The D implementation will not create a new instance - it checks
for typeof(null) - it will return
typeof(Responder.SetSomething).init if SetSomething would be a
field (which is not).
My advice is to stick to conditional code for now, not every
other language feature can be translated.
A single suggestion your example code:
auto var = cast(FooBar)variable;
if (var !is null)
var.callMethod();
can be written as:
if (auto var = cast(Foobar)) var.callMethod();