【问题标题】:Why does the binary + operator not work with two &mut int?为什么二进制 + 运算符不能与两个 &mut int 一起使用?
【发布时间】:2014-05-28 20:12:07
【问题描述】:
fn increment(number: &mut int) {

    // this fails with: binary operation `+` cannot be applied to type `&mut int`
    //let foo = number + number;

    let foo = number.add(number);

    println!("{}", foo);
}

fn main() {
    let mut test = 5;
    increment(&mut test);

    println!("{}", test);
}

为什么number + number 失败但number.add(number) 有效?

作为一个额外的问题:上面打印出来

10
5

我是否正确地假设 test 仍然是 5,因为数据被 复制 以增加?原始的test 变量可以被increment 函数改变的唯一方法是如果它被发送为Box<int>,对吧?

【问题讨论】:

    标签: rust


    【解决方案1】:

    number + number 失败,因为它们是两个引用,而不是两个整数。编译器还告诉我们原因:+ 运算符没有为 &mut int 类型实现。

    您必须使用取消引用运算符 * 取消引用才能获得 int。这将工作let sum = *number + *number;

    number.add(number); 有效,因为 add 的签名是 fn add(&self, &int) -> int;

    我是否正确假设 test 仍然是 5 因为数据被复制了 过度增加?原始测试变量的唯一方法 如果它被发送为 盒子,对吧?

    Test 没有被复制,但仍然是 5,因为它实际上从未发生过变异。如果你愿意,你可以在增量函数中改变它。

    PS:改变它

    fn increment(number: &mut int) {
        *number = *number + *number;
        println!("{}", number);
    }
    

    【讨论】:

    • 感谢您的回答。你能告诉我如何从increment 函数中对其进行变异吗?请注意:我不想从 increment 函数返回一些东西。我想看看如何真正改变传递的 int。
    • 谢谢!我没有看到森林的福雷斯特!
    • 好吧,还有一件事 ;-) 在这个例子中。是否有任何变量存储在堆上?我猜不会。这一切都发生在堆栈上,testnumber 都只是指向内存中堆栈上 中的相同位置。对吗?
    • @Christoph,几乎是正确的。 test 不指向任何地方,它包含值本身,但它是一个堆栈变量,是的。
    • 那么这是如何工作的呢? let t = 4 ; println!("{:?}", &t + &t);
    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2023-03-25
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多