我错过了什么,或者Rust中不支持可变的非引用参数?
举个例子,我正在玩Rust并尝试为所有数字类型实现Euclid's algorithm泛型,理想情况下我只是想按值传递参数并使它们可变,但是编译器会拒绝向参数类型添加关键字 mut
. 所以我必须声明一个可变的参数副本作为函数序言 . 这是惯用的/有效的吗?
use std::ops::Rem;
extern crate num;
use self::num::Zero;
pub fn gcd<T: Copy + Zero + PartialOrd + Rem<Output=T>>(a : T, b : T) -> T
{
let mut aa = a;
let mut bb = b;
while bb > T::zero() {
let t = bb;
bb = aa % bb;
aa = t;
}
aa
}
1 回答
当然可以说一个论证是可变的:
从效率的角度来看应该没问题 . 优化器将看到它们是相同的,不进行任何无关的复制 .
至于惯用语,我不太确定 . 我最初的开始是没有将
mut
放在我的函数参数列表中,因为我觉得这是关于实现的夸大细节 . 如今,我继续把它放在那里 .