Pivot Lang的Union语法

在Pivot Lang中,Union类型允许你将多种不同的类型组合在一起。你可以定义一个Union类型,它可以包含任何你需要的类型。以下是一些Union类型的定义:

type A<T> = f32 | T;
type B<T> = i32 | A<T>;
type D = *i32 | f64;

在上述代码中,A是一个泛型Union类型,它可以是f32或者任何其他类型TB也是一个泛型Union类型,它可以是i32或者类型AD是一个Union类型,它可以是*i32或者f64。 你可以使用Union类型来定义变量,如下所示:

let c: A<i128> = a;
let aa: B<i128> = d;
let ff: D = &gg;

你也可以使用Union类型在函数中作为返回值,如下所示:

fn test_ret_union() Option<i64> {
    return 101;
}

你还可以在Union类型上定义方法,如下所示:

impl<T> A<T> {
    fn name() void {
        let f = (*self) as f32!;
        f = 100.0;
        return;
    }
}

此外,你还可以在函数中使用Union类型作为参数,如下所示:

fn generic<R>(a: Option<R>) void {
    let c = a as R!;
    a = c;
    return;
}

Union与其子类型转化

隐式类型转化

隐式转化主要出现在赋值操作中。例如:

#![allow(unused)]
fn main() {
let c: A<i128> = a;
}

在这行代码中,变量 a 的类型是 i128,在赋值给 c 时,它被隐式转化为 A<i128> 类型。这是因为 A<i128> 类型包含了 i128 类型,所以 i128 类型可以被隐式转化为 A<i128> 类型。

显式类型转化

显式类型转化主要通过 as 关键字进行。例如:

#![allow(unused)]
fn main() {
let h = c as i128?;
}

在这行代码中,变量 c 的类型是 A<i128>,使用 as 关键字将其显式转化为 Option<i128> 类型。因为 A<i128> 类型包含了 i128 类型,但是她不一定是 i128 类型,所以 A<i128> 类型可以被安全的显式转化为 Option<i128> 类型。

强制类型转化

强制类型转化通过 as ... ! 符号进行。例如:

#![allow(unused)]
fn main() {
let i = c!;
}

在这行代码中,变量 c 的类型是 A<i128>,使用 ! 符号将其强制转化为 i128 类型。这是因为 A<i128> 类型包含了 i128 类型,所以 A<i128> 类型可以被强制转化为 i128 类型。