< 返回版块

hzqd 发表于 2020-11-17 15:18

下面是一段 Scala3 的代码:

var foo: Int | String = "abc"
foo match {
    case i: Int => println("i32")
    case s: String => println("str")
}

这段代码定义的 foo 可以是 Int 或 String 类型,并且可以很方便地根据类型模式匹配。

在 Rust 中,也有类似的操作吗?我尝试用 union type 去模拟这种操作:

enum Sum {
    i32, String
}
fn main() {
    let a: Sum = 1i32;
}

获得编译错误:

error[E0308]: mismatched types
 --> src/main.rs:5:18
  |
5 |     let a: Sum = 1i32;
  |            ---   ^^^^ expected enum `Sum`, found `i32`
  |            |
  |            expected due to this

error: aborting due to previous error; 1 warning emitted

是我错误地理解了 union type 吗?可是 Option 类型就是用 enum 实现的,为什么它就可以呢:

let foo: Option<i32> = None;

我应如何正确定义并运用 tagged union type 呢?

评论区

写评论
作者 hzqd 2020-11-17 15:47

感谢解答!这正是我想要的!

--
👇
chinagxwei: ```rust enum Sum { Int(i32), String(String), }

fn main() { let foo = Sum::String(String::from("abc")); match foo { Sum::Int() => println!("i32"), Sum::String() => println!("str") } }


这是否是你想要的?
chinagxwei 2020-11-17 15:39
enum Sum {
    Int(i32),
    String(String),
}

fn main() {
    let foo = Sum::String(String::from("abc"));
    match foo {
        Sum::Int(_) => println!("i32"),
        Sum::String(_) => println!("str")
    }
}

这是否是你想要的?

1 共 2 条评论, 1 页