gpt4 book ai didi

rust - 我应该在哪里使用 &v : &V to describe a parameter in function signatures?

转载 作者:行者123 更新时间:2023-11-29 08:31:29 26 4
gpt4 key购买 nike

您可以在Rust playground 上找到以下代码.

fn main() {
#[derive(Clone, Copy, Debug)]
struct Foo {
bar: u32,
}

fn take_ref(&f: &Foo) {
println!("{:?}", f);
}

fn take_foo(f: Foo) {
println!("{:?}", f);
}

let f = Foo {
bar: 1,
};

take_ref(&f);
println!("{:?}", f);

take_foo(f.clone());
println!("{:?}", f);
}

take_reftake_foo 这两个函数是一样的吗?我什么时候应该使用 &v: &V 而不是 v: V?

最佳答案

一般来说,我认为你不应该使用&f: &Foo 形式。它被编译器接受的唯一原因是函数参数(如 let 赋值)实际上是无可辩驳的模式。如果您尝试放置一般模式,可以在错误消息中看到这一点:

fn take_option (Some (f): Option<Foo>) {
println!("{:?}", f);
}

不提示语法无效,而是给出这个错误信息:

error[E0005]: refutable pattern in function argument: `None` not covered
--> src/main.rs:15:21
|
15 | fn take_option (Some (f): Option<Foo>) {
| ^^^^^^^^ pattern `None` not covered

使用模式作为函数参数可以实现自动元组、数组或结构解构等美好事物:

fn take_tuple ((x, y): (i32, i32)) {
println!("x: {}, y: {}", x, y);
}

fn take_array ([x, y]: [i32; 2]) {
println!("x: {}, y: {}", x, y);
}

fn take_foo (Foo { bar: bar }: Foo) {
println!("bar: {}", bar);
}

population
.iter()
.enumerate()
.map (|(rank, person)| { ... });

关于rust - 我应该在哪里使用 &v : &V to describe a parameter in function signatures?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56633821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com