Movatterモバイル変換


[0]ホーム

URL:


codecamp

盒语法和模式

盒语法和模式

目前,唯一稳定可靠地方法就是通过Box::new 方法来创建Box。当然,它不可能在稳定的 Rust 来析构匹配模式下的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 (析构和匹配模型)方法,因为这个语法在未来仍可能会被更改。

返回指针

在很多计算机语言中都有指针,用户可以通过返回一个指针来避免返回较大数据结构的拷贝。比如:

struct BigStruct {one: i32,two: i32,// etcone_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 的反模式,相反,可以编写成下面的方式:

#![feature(box_syntax)]struct BigStruct {one: i32,two: i32,// etcone_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);}

这个方法是一种不牺牲性能的前提下提供了灵活性。

用户可能会认为这会表现出较差的性能:返回一个值,然后立即用盒装起来?这是最糟糕的模式么?Rust 远远比这些更智能。这并不是将代码进行拷贝。mainbox 分配足够的空间,然后传递一个指针 x 来指向foo。然后,foo 将值写回Box<T>

下面这一点很重要:指针不仅可以优化代码块中返回的值。也允许调用者来选择他们希望他们如何使用他们的输出。

基准测试
切片模式
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录
关于
介绍

新手入门

学习 Rust

高效 Rust

语法和语义

Nightly Rust

词汇表
相关学术研究

关闭

MIP.setData({'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false},'pageFontSize' : getCookie('pageFontSize') || 20});MIP.watch('pageTheme', function(newValue){setCookie('pageTheme', JSON.stringify(newValue))});MIP.watch('pageFontSize', function(newValue){setCookie('pageFontSize', newValue)});function setCookie(name, value){var days = 1;var exp = new Date();exp.setTime(exp.getTime() + days*24*60*60*1000);document.cookie = name + '=' + value + ';expires=' + exp.toUTCString();}function getCookie(name){var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)');return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null;}
[8]ページ先頭

©2009-2025 Movatter.jp