W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
目前,唯一穩(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)行拷貝。 main
為 box
分配足夠的空間,然后傳遞一個指針 x 來指向 foo
。然后,foo
將值寫回 Box<T>
。
下面這一點很重要:指針不僅可以優(yōu)化代碼塊中返回的值。也允許調(diào)用者來選擇他們希望他們?nèi)绾问褂盟麄兊妮敵觥?/p>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: