小编Mon*_*nth的帖子

重载Add-operator而不复制操作数

我正在Rust中编写一个应用程序,它必须集中使用向量算法,我偶然发现了为结构类型设计运算符重载的问题.

所以我有一个这样的矢量结构:

struct Vector3d {
    pub x: f64,
    pub y: f64,
    pub z: f64,
}
Run Code Online (Sandbox Code Playgroud)

我希望能够写出类似的东西:

let x = Vector3d {x:  1.0, y: 0.0, z: 0.0};
let y = Vector3d {x: -1.0, y: 0.0, z: 0.0};

let u = x + y;
Run Code Online (Sandbox Code Playgroud)

据我所知,有三种不同的方法:

  1. 直接实施std::ops::Add特质Vector3d.这有效,但这个特征的方法签名是:

    fn add(self, other: Vector3d)
    
    Run Code Online (Sandbox Code Playgroud)

所以它会在使用后使它的参数无效(因为它会移动它们),这在我的情况下是不可取的,因为许多矢量将用在多个表达式中.

  1. 实现Add特征Vector3d并实现Copy特征.这是有效的,但我觉得如果因为Vector3d它不是一个轻量级的东西(至少24字节)可以快速复制,特别是当有很多调用算术函数时.

  2. 实现Add对参考文献Vector3d,如建议在这里.这是有效的,但为了应用运算符,我将不得不写

    let u = &x + &y;
    
    Run Code Online (Sandbox Code Playgroud)

我不喜欢这种符号,因为它看起来并不完全像数学等价物u = x + …

rust

5
推荐指数
1
解决办法
348
查看次数

如何从具有结构引用的方法返回一个盒装闭包?

我有一个包含值的结构,我想获得一个对该值进行操作的函数:

struct Returner {
    val: i32,
}

impl<'a> Returner {
    fn get(&'a self) -> Box<Fn(i32) -> i32> {
        Box::new(|x| x + self.val)
    }
}
Run Code Online (Sandbox Code Playgroud)

编译失败:

error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
 --> src/main.rs:7:18
  |
7 |         Box::new(|x| x + self.val)
  |                  ^^^^^^^^^^^^^^^^
  |
note: first, the lifetime cannot outlive the lifetime 'a as defined on the impl at 5:1...
 --> src/main.rs:5:1
  |
5 | impl<'a> Returner {
  | ^^^^^^^^^^^^^^^^^
  = note: ...so that the types are …
Run Code Online (Sandbox Code Playgroud)

closures lifetime rust

4
推荐指数
1
解决办法
770
查看次数

标签 统计

rust ×2

closures ×1

lifetime ×1