Tôi đã viết macro đệ quy xấu xí này, vì tôi muốn tìm hiểu điều gì đó về macro.
macro_rules! tuplet {
{ ($y:ident $(, $x:ident)*) = $v:expr } => {
let ($y,$($x),*) = tuplet!($v ; 1 ; ($($x),*) ; ($v[0])); };
{ $v:expr ; $j:expr ; ($y:ident $(, $x:ident)*) ; ($($a:expr),*) } => {
tuplet!($v ; $j+1 ; ($($x),*) ; ($($a),*,$v[$j])) };
{ $v:expr ; $j:expr ;() ; $accu:expr } => { $accu }
}
Tôi mới làm điều này và có thể rất tệ, vì vậy có nhiều khả năng là cách tốt nhất để làm điều đó. Chỉ là một bằng chứng về khái niệm. Nó cho phép bạn viết
v = vec![1,2,3];
tuplet!((a,b,c) = v);
nơi nào đó trong đó định nghĩa macro bạn tìm thấy những phần $v[$j]
, mà bạn có thể thay thế bởi $v.nth($j)
nếu bạn muốn sử dụng nó cho vòng lặp.
Nguồn
2017-05-14 19:02:56
Một vấn đề là tuple là loại. Vì vậy, tuple với 2 yếu tố là loại khác biệt từ tuple của 3 yếu tố. mất (2) có thể không phải là chức năng tốt nhất ở đây, nhưng bạn có thể sẽ yêu cầu macro đặc biệt trả về loại thích hợp dựa trên số bạn vượt qua. –
Bạn muốn hành vi nào khi vectơ chứa ít hơn hai mục? – Shepmaster
@Shepmaster là một câu hỏi tuyệt vời. Trong ánh sáng đó tôi không thể nghĩ ra một lý do đủ tốt để chức năng này có thể thực hiện được. – anderspitman