2015-03-09 11 views

risposta

27

In generale, non è possibile - Rust non supporta le funzioni variadic, eccetto quando l'interoperabilità con codice C che utilizza varargs.

In questo caso, dal momento che tutti i tuoi argomenti sono dello stesso tipo, è possibile accettare una fetta:

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

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

(Playground)

Oltre a ciò, è possibile accettare esplicitamente argomenti opzionali:

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); 
} 

(Playground)

Se è necessario accettare molti argomenti, opzionali o no, è possibile implementare un costruttore:

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")); 
} 

(Playground)

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

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

@Shepmaster Compila ora. Sì, sono d'accordo sulla parte assegnata. C'è un modo simile senza allocazione? – creativcoder

+0

ah sì, la macro non è davvero necessaria qui. Modificheremo la risposta in base al tuo commento. – creativcoder

+0

e se la funzione volesse assumere la proprietà dell'array? – qiuxiafei

Problemi correlati