函数调用中的自动借用

时间:2015-05-19 21:18:14

标签: 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的调用者的情况下进行这些借用。

是否有理由对一般函数参数不会发生自动借用,如果是这样,为什么在使用方法语法时会发生这种情况?

1 个答案:

答案 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。还有自动解决方案的断路器,但它们非常清晰,通常是你想要的。