盒語法和模式

2018-08-12 22:03 更新

盒語法和模式

目前,唯一穩(wěn)定可靠地方法就是通過 Box::new 方法來創(chuàng)建 Box。當(dāng)然,它不可能在穩(wěn)定的 Rust 來析構(gòu)匹配模式下的 Box

不穩(wěn)定的 box 關(guān)鍵字可以用來創(chuàng)建和析構(gòu) Box。相關(guān)的例子如下:

#![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(盒創(chuàng)建方法) 和 box_patterns (析構(gòu)和匹配模型)方法,因為這個語法在未來仍可能會被更改。

返回指針

在很多計算機(jī)語言中都有指針,用戶可以通過返回一個指針來避免返回較大數(shù)據(jù)結(jié)構(gòu)的拷貝。比如:

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 數(shù)。

如下為 Rust 的反模式,相反,可以編寫成下面的方式:

#![feature(box_syntax)]

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

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

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

let y: Box<BigStruct> = box foo(x);
}

這個方法是一種不犧牲性能的前提下提供了靈活性。

用戶可能會認(rèn)為這會表現(xiàn)出較差的性能:返回一個值,然后立即用盒裝起來?這是最糟糕的模式么?Rust 遠(yuǎn)遠(yuǎn)比這些更智能。這并不是將代碼進(jìn)行拷貝。 mainbox 分配足夠的空間,然后傳遞一個指針 x 來指向 foo。然后,foo 將值寫回 Box<T>

下面這一點很重要:指針不僅可以優(yōu)化代碼塊中返回的值。也允許調(diào)用者來選擇他們希望他們?nèi)绾问褂盟麄兊妮敵觥?/p>

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號