我是生锈的新手,我对借用他们的论据的函数有疑问。
在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
的调用者的情况下进行这些借用。
是否有理由对一般函数参数不会发生自动借用,如果是这样,为什么在使用方法语法时会发生这种情况?
答案 0 :(得分:1)
虽然也是用&
编写的,经常被称为&#34;引用&#34;但Rust中的这些类型是C ++用语中的指针。与C ++引用不同,它们是一等值,因此可以(并且必须一般)明确地创建和取消引用。
访问字段和方法是一种非常常见的操作,但是,通常您使用&self
/ &mut self
方法但拥有该对象而不仅仅是对它的引用,或者对结构的引用您需要访问的字段。要求在这些情况下明确创建引用并取消引用它们会导致很多行噪声(特别是因为运算符优先级因此您必须键入(&foo).method()
或(*foo).field
)才能获得基本没有任何好处:引用是免费的,即使在简短的C语言(foo->field
)中,取消引用访问也被认为是值得的捷径。因此,必要时,字段访问自动解除引用(顺便说一下,包括智能指针)和方法调用&#34;自动引用&#34;。
在其他地方(例如论证传递),这通常不太常见,而且显性有时对读者有价值。通常,编译器无法弄清楚您的意思。最近添加的&#34; deref强制&#34;加剧了这种情况。例如,&x
的{{1}}可以产生x: Rc<T>
而不是&T
。还有自动解决方案的断路器,但它们非常清晰,通常是你想要的。