gpt4 book ai didi

rust - 函数调用中的自动借用

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

我是 Rust 的新手,我有一个关于借用他们参数的函数的问题。

在 C++ 中,函数的类型签名单独指定是否通过引用获取参数;调用该函数的代码不需要明确指示它正在传递引用。例如:

// The function signature indicates x should be passed by reference.
void increment(int& x) {
++x;
}
void main() {
int y = 0;
increment(y); // y is implicitly passed by reference
// y is now 1
}

另一方面,Rust 似乎不允许这样做。以下代码将无法编译:

fn output(x: &isize) {
println!("{}", x);
}

fn main() {
let y: isize = 0;
output(y); // Error.
// output(&y); <- this is ok though
}

当通过使用方法语法时,如果函数签名采用&self&mut self 那么这些借用发生在调用者不使用&&mut.

是否存在一般函数参数不会发生自动借用的原因?如果是,为什么在使用方法语法时会发生?

最佳答案

虽然也是用&写的并且经常被称为“引用”,这些类型在 Rust 中是 C++ 术语中的指针。与 C++ 引用不同,它们是一流的值,因此可以(并且通常必须)显式创建和取消引用。

访问字段和方法是一种非常常见的操作,但是,您经常会遇到 &self/&mut self方法,但拥有该对象,而不仅仅是对它的引用,或对需要访问其字段的结构的引用。在那些情况下要求显式创建引用并取消引用它们会导致大量线路噪音(特别是因为运算符优先级因此您必须键入 (&foo).method()(*foo).field )基本上没有任何好处:引用是免费的, 并且即使在简朴的 C 语言 ( foo->field ) 中,取消对 access 的引用也被认为是一条捷径。因此,必要时,字段访问自动解除引用(顺便说一下,包括通过智能指针)和方法调用“自动引用”。

在其他地方(例如参数传递),这不是很常见,而且明确性有时对读者很有值(value)。一般来说,编译器无法理解你的意思。最近添加的“deref 强制”加剧了这种情况,例如 &x对于 x: Rc<T>可能导致 &T而不是 &Rc<T> .也有用于自动取消引用的决胜局,但它们非常明确并且通常是您想要的。

关于rust - 函数调用中的自动借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30336354/

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