Structural exhaustive matching
Justin Whear via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Apr 21 09:22:38 PDT 2015
On Tue, 21 Apr 2015 15:36:27 +0000, Jadbox wrote:
> What's the best equivalent to Rust's structural enum/pattern (match)ing?
> Is it also possible to enforce exhaustive matches?
> Basically, I'm curious on what the best way to do ADTs in D.
std.variant.Algebraic implements ADTs:
import std.variant, std.string;
struct Foo { ... }
alias A = Algebraic!(int, double, Foo);
A a = 1;
// std.variant.visit enforces that all possible types are handled, so this
// is an error:
auto res = a.visit!(
(int x) => format("Got an int: %s", x),
(double x) => format("Got a double: %s", x),
(Foo x) => "Got a Foo"
);
You can also dispatch to a function with the appropriate overloads/
template instantiations like so:
foreach (T; A.AllowedTypes)
if (a.type is typeid(T))
myfunc(a.get!T);
This also exhaustively guarantees that myfunc can be called with all
possible types of a.
More information about the Digitalmars-d-learn
mailing list