相关疑难解决方法(0)

println!借用或拥有变量?

我对借贷和所有权感到困惑.在Rust 文档中有关引用和借用的内容

let mut x = 5;
{
    let y = &mut x;
    *y += 1;
}
println!("{}", x);
Run Code Online (Sandbox Code Playgroud)

他们说

println!可以借x.

我很困惑.如果println!借入x,为什么它通过x&x

我尝试在下面运行此代码

fn main() {
    let mut x = 5;
    {
        let y = &mut x;
        *y += 1;
    }
    println!("{}", &x);
}
Run Code Online (Sandbox Code Playgroud)

除了传递&x给代码之外,这段代码与上面的代码相同println!.它将'6'打印到控制台,这是正确的,与第一个代码的结果相同.

ownership rust

39
推荐指数
1
解决办法
2219
查看次数

如何在Rust中实现值和引用的惯用运算符重载?

当实现原始固定大小的矢量类型(float2例如)时,我想支持AddSub特征.后来,我想支持Mul*Assign.

查看文档和其他示例,我想出了这个:

use std::ops::{Add, Sub};

#[derive(Copy, Clone)]
struct float2(f64, f64);

impl Add for float2 {
    type Output = float2;
    fn add(self, _rhs: float2) -> float2 {
        float2(self.0 + _rhs.0, self.1 + _rhs.1)
    }
}

impl Sub for float2 {
    type Output = float2;
    fn sub(self, _rhs: float2) -> float2 {
        float2(self.0 - _rhs.0, self.1 - _rhs.1)
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于基本的例子,但是我在实践中发现我会经常与作为参数传入,以及局部引用最终float2在栈上的.

混合这些我需要:

  • 取消引用变量(好但是使代码的可读性稍差).
  • 声明运算符也会重载引用的组合.

例:

impl<'a, 'b> Add<&'b float2> for …
Run Code Online (Sandbox Code Playgroud)

operator-overloading rust

9
推荐指数
1
解决办法
622
查看次数

运算符按值重载会导致使用移动值

编译以下使用运算符重载的Rust代码

use std::ops::{Add};

#[derive(Show)]
struct Point {
    x: int,
    y: int
}

impl Add for Point {
    type Output = Point;

    fn add(self, other: Point) -> Point {
        Point {x: self.x + other.x, y: self.y + other.y}
    }
}

fn main() {
    let p: Point = Point {x: 1, y: 0};
    let pp = p + p;
}
Run Code Online (Sandbox Code Playgroud)

由于p的所有权导致编译器错误:

<anon>:21:18: 21:19 error: use of moved value: `p`
<anon>:21     let pp = p + p;
                           ^
<anon>:21:14: 21:15 note: `p` moved …
Run Code Online (Sandbox Code Playgroud)

copy operator-overloading pass-by-value ownership rust

7
推荐指数
2
解决办法
554
查看次数

如何为引用类型实现Add,以便我可以一次添加两个以上的值?

我想创建一个不可变的,引用数据类型,并添加如下:

use std::ops::Add;

struct Point {
    x: i64,
    y: i64,
}

impl<'a> Add for &'a Point {
    type Output = Point;
    fn add(self, other: &Point) -> Point {
        Point {
            x: self.x + &other.x,
            y: self.y + &other.y,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何实现添加特征以引用结构?建议Add在引用类型上实现.

我可以做到这一点,在哪里abPoint:

let c = &a + &b;
let d = &c + &b;
Run Code Online (Sandbox Code Playgroud)

但不是这个:

let d = &a + &b + &b;
Run Code Online (Sandbox Code Playgroud)

我不介意这些&迹象,但不能连锁添加对我来说并不好看.我想实现乘法(z = a + …

add rust

2
推荐指数
1
解决办法
171
查看次数