集册 Rust 编程语言 装箱语法和模式

装箱语法和模式

欢马劈雪     最近更新时间:2020-08-04 05:37:59

180

box-syntax-and-patterns.md
commit 024aa9a345e92aa1926517c4d9b16bd83e74c10d

目前唯一稳定的创建Box的方法是通过Box::new方法。并且不可能在一个模式匹配中稳定的析构一个Box。不稳定的box关键字可以用来创建和析构Box。下面是一个用例:

#![feature(box_syntax, box_patterns)]

fn main() {
    let b = Some(box 5);
    match b {
        Some(box n) if n < 0 => {
            println!("Box contains negative number {}", n);
        },
        Some(box n) if n >= 0 => {
            println!("Box contains non-negative number {}", n);
        },
        None => {
            println!("No box");
        },
        _ => unreachable!()
    }
}

注意这些功能目前隐藏在box_syntax(装箱创建)和box_patterns(析构和模式匹配)gate 之后因为它的语法在未来可能会改变。

返回指针

在很多有指针的语言中,你的函数可以返回一个指针来避免拷贝大的数据结构。例如:

struct BigStruct {
    one: i32,
    two: i32,
    // etc
    one_hundred: i32,
}

fn foo(x: Box<BigStruct>) -> Box<BigStruct> {
    Box::new(*x)
}

fn main() {
    let x = Box::new(BigStruct {
        one: 1,
        two: 2,
        one_hundred: 100,
    });

    let y = foo(x);
}

要点是通过传递一个装箱,你只需拷贝了一个指针,而不是那构成了BigStruct的一百个int值。

上面是 Rust 中的一个反模式。相反,这样写:

展开阅读全文