通过可变价值的惯用方法是什么?

Max*_*kin 5 rust

我错过了什么,或者Rust中不支持可变的非引用参数?

举个例子,我正在玩Rust并试图为所有数字类型实现Euclid的算法泛型,理想情况下我只想按值传递参数并使它们可变,但是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
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 9

当然可以说一个论证是可变的:

pub fn gcd<T>(mut a: T, mut b: T) -> T
    where T: Copy + Zero + PartialOrd + Rem<Output=T>
{
   while b > T::zero() {
      let t = b;
      b = a % b; 
      a = t;
   }

   a
}
Run Code Online (Sandbox Code Playgroud)

[宣布论证的可变副本]惯用/有效吗?

从效率的角度来看应该没问题.优化器将看到它们是相同的,不进行任何无关的复制.

至于惯用语,我不太确定.我最初是因为没有放入mut我的函数参数列表而开始,因为我觉得它是关于实现的夸大细节.如今,我继续把它放在那里.

  • `mut a:T`在rustdoc中呈现为'a:T`,因此它作为内部细节处理.它确实对函数签名没有影响. (5认同)