首页 > 解决方案 > 如何匹配 Rust 中的闭包

问题描述

我有一个ABC带有 3 个变体的枚举,它们共享相同的S结构,因此我想用相同的变量对它们调用相同的方法。我知道我可以实现一个特征,但这是对 where 示例的简化AB并且C有其他结构使它们不同,但它们共享相同的方法。

enum S{}

impl S{
    pub fn do_something(&self, number: u8) -> Result<(),()>{
    }
}

enum ABC{
    A(S),
    B(S),
    C(S)
}

//This is my attempt, but I don't know how to match for closures
macro_rules! for_each_stack {
    ($self:ident: &ABC, $b:block) => { 
        match $self {
            ABC::A(s) => $b(s),
            ABC::B(s) => $b(s),
            ABC::C(s) => $b(s),
        }
     }
}

impl ABC {
    //I'm trying to substitute this:
    pub fn do_something(&self, number: u8) {
        match self {
            ABC::A(s) => s.do_something(number),
            ABC::B(s) => s.do_something(number),
            ABC::C(s) => s.do_something(number),  
        }
    }
    //By this macro call
    pub fn do_something2(&self, number: u8) {
        for_each_stack!(self, |s| s.do_something(number))
    }
}

操场

我在匹配闭包的宏时遇到了困难。我该怎么做?我尝试了一个块,但这当然行不通。

看我也在强迫$self:ident: &ABC,所以我可以匹配它的变体。

标签: rustmacros

解决方案


推荐阅读