实现基于类型的宏时,为什么在<$a>中需要尖括号? [英] Why do I need angle brackets in <$a> when implementing macro based on type?

查看:16
本文介绍了实现基于类型的宏时,为什么在<$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。我不明白为什么宏代码需要与非宏代码不同。

playground

推荐答案

语法是_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的票证中有针对此情况的解决方法。

这篇关于实现基于类型的宏时,为什么在&lt;$a&gt;中需要尖括号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆