rust - 使用复制和克隆来修复“使用移动值”是否昂贵?
问题描述
我有一个minus
导致use of moved value: 'scalar'
编译错误的函数,这是有道理的。
struct Point<T> {
x: T,
y: T,
z: T,
}
impl<T: Sub<Output = T>> Point<T> {
//subtract scalar value from all Point fields.
fn minus(self, scalar: T) -> Self {
Point {
x: self.x - scalar,
y: self.y - scalar,
z: self.z - scalar,
}
}
}
解决方案 1
使类型可T
克隆。它解决了这个问题,但它似乎是非常昂贵的操作,因为它正在复制每个字段的标量值。还有其他更便宜的解决方案吗?
impl<T: Sub<Output = T> + Clone> Point<T> {
fn minus(self, scalar: T) -> Self {
Point {
x: self.x - scalar.clone(),
y: self.y - scalar.clone(),
z: self.z - scalar.clone(),
}
}
}
尝试的解决方案 2
我想也许我可以使用参考。但后来我得到cannot subtract '&T' from '&T'
了,我不明白。
有没有更有效的方法来做到这一点而不是输入值Clone
?Copy
scalar
impl<T: Sub<Output=T>> Point<T> {
fn minus(self, scalar: &T) -> Self {
Point {
x: &self.x - scalar,
y: &self.y - scalar,
z: &self.z - scalar,
}
}
}
解决方案
要减去Copy
或者Clone
你需要限制你的元素可以通过引用减去,即&T - &T
。您可以通过使用更高级别的 trait bound进行约束来做到这一点。(这显示在@trentcl 提供的链接中)
impl<T> Point<T>
where
for<'a> &'a T: Sub<Output = T>,
{
fn minus(&self, scalar: &T) -> Self {
Point {
x: &self.x - scalar,
y: &self.y - scalar,
z: &self.z - scalar,
}
}
}
数学运算符的实现至少应该有可用的按引用,即使按值对基本Copy
类型来说更方便和可读。
Copy
或是否Clone
昂贵取决于是什么T
,但由于这是一个通用上下文,因此您应该尽可能避免复制或克隆,以便在昂贵的情况下避免成本。如果不可能,Rust 会强制您添加Copy
/Clone
约束,以便调用者知道该值可能被复制,并可以判断这是否合适。
推荐阅读
- javascript - 用不同的标识符替换对象属性名称
- ios - 什么是 Xcode“后台处理”后台模式?
- java - 从实时 Firebase 数据库中检索字符串
- virtualbox - 在 vm 中禁用时间同步
- swift - UIStackView 子视图仅在 isHidden 设置为 false 时才动画
- flutter - 如何使 AppBar 居中以及如何减小 PrefrerredSize 中的领先图标大小?
- c# - 如何将 Json 转换为字符串然后显示在列表中
- javascript - 如何在具有自己路径的 Javascript 中使用 FileReader?
- angular - 如何使用 Angular 8 中的列规范将任何对象传递到通用概述中?
- python-2.7 - 如何解决:将 argparse 参数分配给变量 将参数和值都分配给变量