我是 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
}
Run Code Online (Sandbox Code Playgroud)
另一方面,Rust 似乎不允许这样做。以下代码将无法编译:
fn output(x: &isize) {
println!("{}", x);
}
fn main() {
let y: isize = 0;
output(y); // Error.
// output(&y); <- this is ok though
}
Run Code Online (Sandbox Code Playgroud)
使用方法语法 through 时,如果函数签名采用&self或&mut self则这些借用发生而调用方不使用&or &mut。
对于一般函数参数是否有自动借用不会发生的原因,如果是这样,为什么在使用方法语法时会发生这种情况?
小智 0
尽管这些类型也用“引用”编写&,并且经常被称为“引用”,但 Rust 中的这些类型是C++ 术语中的指针。与 C++ 引用不同,它们是一流的值,因此可以(并且通常必须)显式创建和取消引用。
然而,访问字段和方法是一种非常常见的操作,通常您拥有&self/&mut self方法但拥有该对象,而不仅仅是对其的引用,或者对需要访问其字段的结构的引用。在这些情况下要求显式创建引用并取消引用它们会导致大量线路噪音(特别是因为运算符优先级因此您必须键入(&foo).method()or (*foo).field),但基本上没有任何好处:获取引用是免费的,取消引用访问是即使在简洁的 C 语言中,也被认为值得走捷径 ( foo->field)。因此,在必要时,字段访问自动取消引用(顺便说一下,包括智能指针)和方法调用“自动引用”。
在其他地方(例如参数传递),这种需要很少见,并且明确性有时对读者来说很有价值。一般来说,编译器无法理解你的意思。最近添加的“解引用强制转换”加剧了这种情况,例如,&xforx: Rc<T>可能导致 a&T而不是 a &Rc<T>。还有自动取消参考的决胜局,但它们非常明确并且通常是您想要的。
| 归档时间: |
|
| 查看次数: |
672 次 |
| 最近记录: |