当前位置:  开发笔记 > 编程语言 > 正文

Rust宏接受类型与通用参数

如何解决《Rust宏接受类型与通用参数》经验,为你挑选了1个好方法。

我有一个实现特征的宏impl_Trait!().现在,它适用于没有通用参数的类型,但我不确定如何将类型参数添加到impl关键字.

macro_rules! impl_FooTrait {
    ($name:ty) => {
        impl $crate::FooTrait for $name { ... }
    };
}

struct Bar(i32);
impl_FooTrait!(Bar);
// All OK

struct Baz<'a>(&'a i32);
impl_FooTrait!(Baz<'a>);
// use of undeclared lifetime name `'a`

Simon Whiteh.. 6

以免责声明的方式提交此答案:可能有更好的方法可以做到这一点.我还不熟悉宏观的土地.

你可以使用tt(单个标记)标识符来接受你想要的另一个宏臂(游乐场链接)的生命周期

macro_rules! impl_FooTrait {
    ($name:ty, $lifetime:tt) => {
        impl<$lifetime> $crate::FooTrait for $name {  }
    };
    ($name:ty) => {
        impl $crate::FooTrait for $name {  }
    };
}

struct Bar(i32);
impl_FooTrait!(Bar);

struct Baz<'a>(&'a i32);
impl_FooTrait!(Baz<'a>, 'a); // Use and declare the lifetime during macro invocation

看起来我觉得有点奇怪.我有兴趣看到任何其他有替代品的答案.

这是一个实际实现的例子:Playground链接



1> Simon Whiteh..:

以免责声明的方式提交此答案:可能有更好的方法可以做到这一点.我还不熟悉宏观的土地.

你可以使用tt(单个标记)标识符来接受你想要的另一个宏臂(游乐场链接)的生命周期

macro_rules! impl_FooTrait {
    ($name:ty, $lifetime:tt) => {
        impl<$lifetime> $crate::FooTrait for $name {  }
    };
    ($name:ty) => {
        impl $crate::FooTrait for $name {  }
    };
}

struct Bar(i32);
impl_FooTrait!(Bar);

struct Baz<'a>(&'a i32);
impl_FooTrait!(Baz<'a>, 'a); // Use and declare the lifetime during macro invocation

看起来我觉得有点奇怪.我有兴趣看到任何其他有替代品的答案.

这是一个实际实现的例子:Playground链接


如果将$ lifetime:tt替换为$($ args:tt)*`,它将适用于任意数量的泛型参数。* eg *`impl_FooTrait!(Qux <'a,T>,'a,T:'a);`
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有