Как создать функцию с переменным числом аргументов? Как создать функцию с переменным числом аргументов в Rust? Как этот код Java: void foo(String... args) { for (String arg : args) { System.out.println(arg); } } Ответ 1 В общем, вы не можете - Rust не поддерживает вариационные функции, кроме случаев взаимодействия с C-кодом, который использует varargs. В этом случае, поскольку все ваши аргументы одного типа, вы можете принять срез: fn foo(args: &[&str]) { for arg in args { println!("{}", arg); } } fn main() { foo(&["hello", "world", "I", "am", "arguments"]); } (Игровая площадка) Кроме того, вы можете явно принимать необязательные аргументы: 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); } (Игровая площадка) Если вам нужно принять много аргументов, необязательных или нет, вы можете реализовать построитель: 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")); } (Игровая площадка) Ответ 2 fn variable_func<T>(_vargs: &[T]) {} fn main() { variable_func(&[1]); variable_func(&[1, 2]); variable_func(&["A", "B", "C"]); }
Ответ 1 В общем, вы не можете - Rust не поддерживает вариационные функции, кроме случаев взаимодействия с C-кодом, который использует varargs. В этом случае, поскольку все ваши аргументы одного типа, вы можете принять срез: fn foo(args: &[&str]) { for arg in args { println!("{}", arg); } } fn main() { foo(&["hello", "world", "I", "am", "arguments"]); } (Игровая площадка) Кроме того, вы можете явно принимать необязательные аргументы: 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); } (Игровая площадка) Если вам нужно принять много аргументов, необязательных или нет, вы можете реализовать построитель: 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")); } (Игровая площадка)
Ответ 2 fn variable_func<T>(_vargs: &[T]) {} fn main() { variable_func(&[1]); variable_func(&[1, 2]); variable_func(&["A", "B", "C"]); }