On Thursday, 31 July 2014 at 20:28:55 UTC, Remo wrote:
How to translate this useless Rust code to D, with as least D code as possible ? How be sure that everything will still work as expected if programmer will add White color ?

  enum Color {
    Red,
    Green,
    Blue,
    Rgb(int,int,int)
  }

  fn main() {
    let r = Rgb(64,128,255);
    match r {
      Red   => println!("Red"),
      Green => println!("Green"),
      Blue  => println!("Blue"),
      Rgb(r,g,b)   => println!("Rgb({},{},{})",r,g,b),
    }
  }

import std.stdio;
import std.variant;

struct Red {}
struct Green{}
struct Blue {}
struct RGB
{
        int r;
        int g;
        int b;
}

alias Color = Algebraic!(Red, Green, Blue, RGB);

void main()
{
        auto r = Color(RGB(64, 128, 255));
        r.visit!(
                (Red   r) => writeln("Red"),
                (Green g) => writeln("Green"),
                (Blue  b) => writeln("Blue"),
                (RGB rgb) => writefln("RGB(%s, %s, %s)", rgb.r, rgb.g, rgb.b),
        );
}

D's Algebraic needs some work, but it's okay for basic usage. The most annoying thing is that you can't instantiate an RGB and expect the compiler to magically know that it's a subtype of Color. Maybe there's a way to work around that, but I can't think of one right off.

Reply via email to