2015-07-13 15 views
5

Czy brakuje mi czegoś, czy też zmienne argumenty nieodsyłania nie są obsługiwane w Rust?Jaki jest idiomatyczny sposób przekazywania wartości zmiennej?

Aby dać przykład, bawiłem się z Rustem i próbowałem implementować Euclid's algorithm generyczny dla wszystkich typów liczbowych, i idealnie chciałem tylko przekazać argumenty według wartości i mieć je zmienne, ale dodanie słowa kluczowego mut do typu argumentu jest odrzucone przez kompilator. Tak więc muszę zadeklarować zmienną kopię argumentu jako prologu funkcji. Czy to jest idiomatyczne/skuteczne?

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 
} 

Odpowiedz

9

To z pewnością można powiedzieć, że to argument będzie zmienny:

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 
} 

Czy [deklarowania zmienny kopii argumentu] idiomatyczne/wydajny?

Powinno być dobrze z punktu widzenia wydajności. Optymalizator zobaczy, że są one takie same i nie wykonują żadnego obcego kopiowania.

Co do idiomatycznego, nie jestem tego taki pewien. Początkowo nie umieszczałem mut w mojej liście argumentów funkcji, ponieważ czułem, że zawiera on więcej szczegółów na temat implementacji. W dzisiejszych czasach robię to.

+0

Duh! Pisałem 'mut' przed' T', myślałem, że jest podobny do tego, jak wygląda mutable ref type ... Dzięki! –

+0

@MaxGalkin yup, odzwierciedla to, jak zmienne wiązanie zmiennych jest zadeklarowane w innych miejscach - 'let mut foo: u8 = 42'. – Shepmaster

+0

Patrzyłem na przykłady z 'a: & mut T', gdzie' mut' jest obok typu i myślałem, że po prostu pozostaje obok typu :) –

Powiązane problemy