Próbuję utworzyć makro w Rust, który pozwala mi napisaćJak używać makr variadic do wywoływania konstruktorów zagnieżdżonych?
make_list!(1, 2, 3)
zamiast
Node::new(1, Node::new(2, Node::new(3, None)))
które powinny pracować dla dowolnej liczby „Parametry” w tym zero. To, co mam tak daleko:
macro_rules! make_list(
() => (
None
);
($x:expr, $($more:expr),*) => (
Node::new($x, make_list!($($more),*))
)
);
ale pojawia się następujący błąd:
error: unexpected end of macro invocation
--> src/main.rs:19:42
|
19 | Node::new($x, make_list!($($more),*))
| ^^^^^
nie mogę sensu tego. Z tego co wiem, powinno działać. Co zrobiłem źle?
Kompletny kod:
type List<T> = Option<Box<Node<T>>>;
struct Node<T> {
value: T,
tail: List<T>,
}
impl<T> Node<T> {
fn new(val: T, tai: List<T>) -> List<T> {
Some(Box::new(Node::<T> {
value: val,
tail: tai,
}))
}
}
macro_rules! make_list(
() => (
None
);
($x:expr, $($more:expr),*) => (
Node::new($x, make_list!($($more),*))
)
);
fn main() {
let _list: List<i32> = make_list!(1, 2, 3, 4, 5, 6, 7, 8, 9);
}
Twoje makro przyjmuje 0 lub 2 argumenty, ale przekazujesz je tylko 1 – Arjan
@Arjan: Ale myślałem, że to jest to, za co $ (...), * jest. Powinien pasować zero do większej liczby argumentów. Czy nie powinien? – sellibitze