Theo isuue này issue và answered question này nó không thể chỉ cần xác định một bí danh đặc điểm như:Macro để xác định đặc điểm bí danh
trait Alias = Foo + Bar;
Cách giải quyết là một chút xấu xí:
trait Alias : Foo + Bar {}
impl<T: Foo + Bar> Alias for T {}
Do đó Tôi muốn xác định một macro cho việc này. Tôi cố gắng
macro_rules! trait_alias {
($name : ident, $base : expr) => {
trait $name : $base {}
impl<T: $base> $name for T {}
};
}
trait Foo {}
trait Bar {}
trait_alias!(Alias, Foo + Bar);
Nhưng nó không thành công với lỗi:
src\main.rs:5:17: 5:22 error: expected one of `?`, `where`, or `{`, found `Foo + Bar`
src\main.rs:5 trait $name : $base {}
^~~~~
lẽ Foo + Bar
không phải là một biểu hiện. Tôi đã thử một số biến thể khác nhưng không có may mắn. Có thể xác định macro như vậy không? Nó trông như thế nào?
Không phải là 'ident' quá hạn chế (trong ví dụ đầu tiên)? Nó sẽ không cho phép một cái gì đó như 'other_module :: Foo'. Tôi đoán nó nên là 'con đường'. –
@VladimirMatveev: vị trí giới hạn đặc điểm không giống như 'đường dẫn'. Mặc dù không sử dụng giải pháp 'items', sử dụng' ident' là lựa chọn duy nhất của bạn. –