Rust:动态大小类型和 Sized trait

691 阅读2分钟

动态大小类型:

Rust是一门系统编程语言,它提供了许多强大的特性,包括动态大小类型。动态大小类型是指在编译时无法确定其大小的类型,它们通常用于处理不定长的数据。这有时被称为 ”DST” 或 ”unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。

动态大小类型的定义和用法:动态大小类型通常用str[T]来表示。例如,我们可以定义一个函数来接受一个字符串切片作为参数:

fn print_str(s: &str) {
    println!("{}", s);
}

在上面的代码中,&str就是一个动态大小类型,它表示一个字符串切片。

Sized trait的定义和用法:

Rust 隐式的为每一个泛型函数增加了 Sized bound。也就是说,对于如下泛型函数定义:

fn generic(t: T) {
    // --snip--
    }

实际上被当作如下处理:

fn generic(t: T) { 
    // --snip-- 
    } 

泛型函数默认只能用于在编译时已知大小的类型。然而可以使用如下特殊语法来放宽这个限制:

fn generic(t: &T) { 
    // --snip-- 
    } 

?Sized 上的 trait bound 意味着 ”T 可能是也可能不是 Sized” 同时这个注解会覆盖泛型类型必须在编译 时拥有固定大小的默认规则。这种意义的 ?Trait 语法只能用于 Sized ,而不能用于任何其他 trait。

在上面的代码中,T: ?Sized表示T可能没有实现Sized trait。

动态大小类型和Sized trait之间的关系:

动态大小类型和Sized trait之间有着密切的关系。动态大小类型没有实现Sized trait,因此它们不能直接作为函数参数或返回值。但是我们可以使用引用或指针来间接传递动态大小类型。

实例分析:下面是一个简单的例子,展示了如何在实际编程中使用动态大小类型和Sized trait:

fn print_str(s: &str) {
    println!("{}", s);
}

fn print_anything<T: ?Sized>(t: &T) {
    println!("{:?}", t);
}

fn main() {
    let s = "hello";
    print_str(s);
    print_anything(s);

    let arr = [1, 2, 3];
    print_anything(&arr);
}

在上面的代码中,我们定义了两个函数:print_strprint_anythingprint_str函数接受一个字符串切片作为参数,类型大小必须是已知的,而print_anything函数则可以接受任意类型的参数。

在main函数中,我们分别使用这两个函数来打印字符串和数组。 from刘金,转载请注明原文链接。感谢!