实现基于类型的宏时,为什么在<;$a>;中需要尖括号? [英] Why do I need angle brackets in <$a> when implementing macro based on type?
本文介绍了实现基于类型的宏时,为什么在<;$a>;中需要尖括号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我可以实现采用如下类型的宏:
trait Boundable<A> {
fn max_value() -> A;
}
impl Boundable<u8> for u8 {
fn max_value() -> u8 { u8::MAX }
}
当我将impl
转换为宏时,为什么需要用尖括号括起类型本身,如下图所示?
macro_rules! impl_boundable {
($a:ty) => {
impl Boundable<$a> for $a {
fn max_value() -> $a { <$a>::MAX }
}
};
}
impl_boundable!(i8);
特别是<$a>::MAX
。如果没有它,编译器会给我错误missing angle brackets in associated item path
。我不明白为什么宏代码需要与非宏代码不同。
推荐答案
语法是_path_::item
,不是_type_::item
。有效路径包括类型T
的标识符和<T>
。
u8::MAX
中,允许u8
是因为它是标识符,而不是因为它是类型。不允许[u8; 1]::item
。
如果宏采用$a:ident
,而不是$a:ty
,则它将按原样处理也是标识符的类型,如u8
。但是,接受类型$a:ty
时,从类型创建路径的一般方式是使用尖括号<$a>
。
您的宏也可以选择直接接受路径:$a:path
。但是您可能会遇到bug #48067:解析器无法计算出如何从较小的路径段组成路径。use $a as base; base::MAX
的票证中有针对此情况的解决方法。
这篇关于实现基于类型的宏时,为什么在<;$a>;中需要尖括号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文