Tôi đang cố gắng để tạo ra một macro trong Rust cho phép tôi viếtLàm thế nào để sử dụng các macro variadic để gọi các hàm tạo lồng nhau?
make_list!(1, 2, 3)
thay vì
Node::new(1, Node::new(2, Node::new(3, None)))
mà nên làm việc cho một số tùy ý các "thông số" bao gồm zero. Đây là những gì tôi có cho đến nay:
macro_rules! make_list(
() => (
None
);
($x:expr, $($more:expr),*) => (
Node::new($x, make_list!($($more),*))
)
);
nhưng tôi nhận được lỗi sau:
error: unexpected end of macro invocation
--> src/main.rs:19:42
|
19 | Node::new($x, make_list!($($more),*))
| ^^^^^
tôi không thể có ý nghĩa nhiều về điều này. Từ những gì tôi có thể nói, nó sẽ hoạt động. Tôi đã làm gì sai?
Các mã hoàn chỉnh:
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);
}
Macro của bạn nhận 0 hoặc 2 đối số nhưng bạn chỉ chuyển nó 1 – Arjan
@Arjan: Nhưng tôi nghĩ đó là những gì $ (...), * dành cho. Nó phải khớp không với nhiều đối số hơn. Có nên không? – sellibitze