2015-07-13 19 views
5

Bir şey eksik mi, yoksa Rust'ta desteklenmeyen değişken referanslar mı var? Değişebilir değerden geçmenin deyimsel yolu nedir?

Ben Rust oynuyordum, bir örnek vermek ve tüm sayısal türleri için Euclid's algorithm jenerik uygulamaya çalışmıştır ve ideal ben sadece onları değişken değeriyle argümanları geçmek ve olmasını istedik, ama argüman tipine anahtar kelime mut ekleyerek reddedilir için derleyici tarafından. Bu yüzden argümanın değiştirilemez bir kopyasını işlev yanlısı olarak ilan etmek zorundayım. Bu idiyomik mi/etki mi?

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 
} 

cevap

9

O bir argüman değişken olacağını söylemek kesinlikle mümkün:

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 
} 

deyimsel/verimli [Tartışmanın bir değişken kopyasını ilan] mı?

Verimlilik açısından iyi olmalıdır. Optimize edici, aynı olduklarını ve herhangi bir yabancı kopyalama yapmadıklarını göreceklerdir.

Idiomatic'e gelince, emin değilim. Ben aslında uygulama ile ilgili detayları aşan olduğunu düşündüğüm gibi ben mut benim fonksiyon argüman listesi koyarak değil. Bugünlerde devam edip oraya koydum.

+0

Duh! 'T' önce 'mut' yazıyordum, nasıl değişebilen bir ref tipi imzanın nasıl göründüğüne benziyordu ... Teşekkürler! –

+0

@MaxGalkin yup, başka yerlerde değişebilen bir değişken bağlanmanın nasıl bildirildiğini yansıtır - 'mut foo: u8 = 42'. – Shepmaster

+0

'a: & mut T' ile örneklere bakıyordum, 'mut' türünün yanında ve ben sadece yazının yanında durduğunu sanıyordum :) –

İlgili konular