Ответ 1
На ночном компиляторе:
#![feature(fn_traits)]
fn main() {
let tuple = (10, Vec::new());
std::ops::Fn::call(&foo, tuple);
}
fn foo(a: i32, b: Vec<i32>) {
}
У AFAIK нет стабильного способа сделать это.
Если я хочу распаковать кортеж и передать его в качестве аргументов, есть способ сделать это:
//Does not compile
fn main() {
let tuple = (10, Vec::new());
foo(tuple);
}
fn foo(a: i32, b: Vec<i32>) {
//Does stuff.
}
Вместо того, чтобы делать это:
fn main() {
let tuple = (10, Vec::new());
foo(tuple.0, tuple.1);
}
fn foo(a: i32, b: Vec<i32>) {
//Does stuff.
}
На ночном компиляторе:
#![feature(fn_traits)]
fn main() {
let tuple = (10, Vec::new());
std::ops::Fn::call(&foo, tuple);
}
fn foo(a: i32, b: Vec<i32>) {
}
У AFAIK нет стабильного способа сделать это.
Существует способ, используя магию соответствия шаблону:
fn main() {
let tuple = (10, Vec::new());
foo(tuple);
}
fn foo((a, b): (i32, Vec<i32>)) {
// do stuff
}
По ссылке Rust:
Как и в случае с привязками привязки, аргументы функции являются неопровержимыми шаблонами, поэтому любой шаблон, который является допустимым в привязке let, также действителен в качестве аргумента.
Таким образом, вы можете указать аргумент, например:
(a, b): (i32, Vec<i32>)
точно так же, как в предложении let
.
let (a, b) = (10, Vec::new());
foo(a, b);