On Sunday, 1 April 2018 at 15:54:16 UTC, Steven Schveighoffer wrote:
I currently have a situation where I want to have a function that accepts a parameter optionally.

I thought maybe Nullable!int might work:

void foo(Nullable!int) {}

void main()
{
   foo(1); // error
   int x;
   foo(x); // error
}

Apparently, I have to manually wrap an int to get it to pass. In other languages that support optional types, I can do such things, and it works without issues.

I know I can do things like this:

void foo(int x) { return foo(nullable(x)); }

But I'd rather avoid such things if possible. Is there a way around this? Seems rather limiting that I can do:

Nullable!int x = 1;

but I can't implicitly convert 1 to a Nullable!int for function calls.

-Steve

My workaround is to use struct initialization:

---
import std.stdio, std.typecons;

static struct FooConfig
{
    Nullable!int a;
}

void foo(FooConfig optionalConfig = FooConfig.init)
{
    optionalConfig.writeln;
}

void main()
{
    foo();

    FooConfig params = {
       a: 42,
    };
    foo(params);
    //foo(FooConfig(42)); // <- hehe, no implicit conversion
}
---

https://run.dlang.io/is/HvN701

I know the separate line and variable is annoying.
With the in-place struct-initialization DIP (https://github.com/dlang/DIPs/pull/71), it would become sth. like:

foo(FooConfig({a : 42}));
foo(FooConfig{a : 42});

(syntax is not clear yet and I still haven't gotten around implementing this in DMD)

Reply via email to