Soru Değişken sayıdaki argümanlarla nasıl bir işlev oluşturabilirim?


Rust'ta değişken sayıda argüman ile bir işlevi nasıl oluşturabilirim?

Bu Java kodu gibi:

void foo(String... args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}

21
2018-03-09 20:51


Menşei




Cevaplar:


Genel olarak, yapamazsınız - Rust, varargs kullanan C kodu ile birlikte çalıştığı durumlar haricinde, variadic işlevleri desteklemez.

İçinde bu durumda, tüm bağımsız değişkenleriniz aynı tür olduğundan, bir dilimi kabul edebilirsiniz:

fn foo(args: &[&str]) {
    for arg in args {
        println!("{}", arg);
    }
}

fn main() {
    foo(&["hello", "world", "I", "am", "arguments"]);
}

(Oyun alanı)

Bunun ötesinde, isteğe bağlı argümanları açıkça kabul edebilirsiniz:

fn foo(name: &str, age: Option<u8>) {
    match age {
        Some(age) => println!("{} is {}.", name, age),
        None      => println!("Who knows how old {} is?", name),
    }
}

fn main() {
    foo("Sally", Some(27));
    foo("Bill", None);
}

(Oyun alanı)

İsteğe bağlı veya bağımsız değişkenleri kabul etmeniz gerekiyorsa, bir oluşturucu uygulayabilirsiniz:

struct Arguments<'a> {
    name: &'a str,
    age: Option<u8>,
}

impl<'a> Arguments<'a> {
    fn new(name: &'a str) -> Arguments<'a> {
        Arguments {
            name: name,
            age: None
        }
    }

    fn age(self, age: u8) -> Self {
        Arguments {
            age: Some(age),
            ..self
        }
    }
}

fn foo(arg: Arguments) {
    match arg.age {
        Some(age) => println!("{} is {}.", arg.name, age),
        None      => println!("Who knows how old {} is?", arg.name),
    }
}

fn main() {
    foo(Arguments::new("Sally").age(27));
    foo(Arguments::new("Bill"));
}

(Oyun alanı)


28
2018-03-09 20:56





fn variable_func<T>(_vargs: &[T]) {}

fn main() {
    variable_func(&[1]);
    variable_func(&[1, 2]);
    variable_func(&["A", "B", "C"]);
}

1
2017-07-11 11:25



@Shepmaster şimdi derler. Evet, tahsis bölümüne katılıyorum. Tahsis edilmeden benzer bir yolu var mı? - creativcoder
ah evet, makro burada gerçekten gerekli değildir. Cevabınızı yorumunuza göre değiştireceğim. - creativcoder
eğer fonksiyonun dizinin sahipliğini almasını istersem? - qiuxiafei
@qiuxiafei dizinin büyüklüğünü kodlayamazsanız (bu yüzden değişken olmasın), ya da her biri için bir varyant yazarsınız [T; N] destek olmak istiyorsan, ona vermek zorundasın Vec<T> - kbolino
Kbolino evet, ben Vec <T> tek çözüm olduğunu düşünüyor. - qiuxiafei