Rust 什么';传递可变值的惯用方法是什么?

Rust 什么';传递可变值的惯用方法是什么?,rust,Rust,我是否遗漏了什么,或者Rust中不支持可变的非引用参数 举一个例子,我在玩Rust,并试图为所有数值类型实现泛型,理想情况下,我只想按值传递参数并使其可变,但向参数类型添加关键字mut会被编译器拒绝。所以我必须声明参数的可变副本作为函数序言。这是惯用的/有效的吗 use std::ops::Rem; extern crate num; use self::num::Zero; pub fn gcd<T: Copy + Zero + PartialOrd + Rem<Output=

我是否遗漏了什么,或者Rust中不支持可变的非引用参数

举一个例子,我在玩Rust,并试图为所有数值类型实现泛型,理想情况下,我只想按值传递参数并使其可变,但向参数类型添加关键字
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
}
使用std::ops::Rem;
外部板条箱数量;
使用self::num::Zero;
发布fn gcd(a:T,b:T)->T
{
设mut aa=a;
设mut-bb=b;
而bb>T::zero(){
设t=bb;
bb=aa%bb;
aa=t;
}
aa
}

当然可以说参数是可变的:

使用num::Zero;//0.4.0
使用std::ops::Rem;
发布fn gcd(多个a:T,多个b:T)->T
哪里
T:复制+零+部分记录+Rem,
{
而b>T::zero(){
设t=b;
b=a%b;
a=t;
}
A.
}
[声明参数的可变副本]是否惯用/有效

从效率的角度来看,这应该是好的。优化器将看到它们是相同的,不会进行任何无关的复制


至于惯用语,我不太确定。最初,我没有将
mut
放在函数参数列表中,因为我觉得它过于关注实现的细节。现在,我把它放在那里。

Duh!我在
T
之前写过
mut
,认为它类似于可变ref类型签名的外观。。。谢谢@MaxGalkin是的,它反映了可变变量绑定是如何在其他地方声明的-
让mut foo:u8=42
。我在看
a:&mut T T
的例子,其中
mut
在类型旁边,我认为它只是在类型旁边:)
mut a:T
在rustdoc中被呈现为
a:T
,因此,它是按照内部细节处理的。它确实对函数签名没有影响。