gpt4 book ai didi

rust - 将模式作为函数参数传递?

转载 作者:行者123 更新时间:2023-12-03 11:39:32 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How can I store a pattern in a variable in Rust?

(1 个回答)


1年前关闭。




我想知道有没有办法将模式作为函数参数传递。

我有:

pub enum KEYWORD {
assign(ASSIGN),
symbol(SYMBOL),
illegal
}

pub enum ASSIGN { /* some enums */ }
pub enum SYMBOL { /* some enums */ }


现在,我知道我可以使用 match!或我制作的 expect!宏来匹配我的 key l.key()所以:
macro_rules! expect(($e:expr, $p:pat) => (
match $e {
$p => { true },
_ => { false }
}
));

expect!(l.key(), KEYWORD::symbol(_));

但是,我需要更多案例,我需要通过 KEYWORD::symbol(_)作为函数参数,例如:
impl l {
pub fn expect_as_func(&self, KEYWORD) { /* some code */ }
}

l.expect_as_func(KEYWORD::symbol(_));

但是这个 l.expect_as_func(KEYWORD::symbol(_));是错误的,因为我使用的不是一个值,而是一个模式。

我尝试使用 proc_macroTokenStream :
pub fn expect(&mut self, patt: TokenStream) -> bool {
match &self {
patt => { true },
_ => { false }
}
}

但这也不起作用。

最佳答案

从人体工程学的角度来看,您可以尝试实现功能 is_assign , is_symbol , is_illegal在你的枚举上:

impl KEYWORD {
fn is_assign(&self) -> bool {
match self {
KEYWORD::assign(_) => true,
_ => false,
}
}
// and so on
}

现在,由于这一切变得乏味,你可以例如创建一个生成这些函数的宏:
macro_rules! generate_is(($variant: pat, $fn_name: ident) => {
fn $fn_name(&self) -> bool {
match self {
$variant => true,
_ => false,
}
}
});

impl KEYWORD {
generate_is!(KEYWORD::assign(_), is_assign);
generate_is!(KEYWORD::symbol(_), is_symbol);
generate_is!(KEYWORD::illegal, is_illegal);
}

这样,来电者只需说 keyword.is_assign() (或类似的)。

然后,除此之外,您可以尝试发明一些自动生成 is_... 的东西。 - 来自您的枚举的函数。 (可能通过程序宏。)

关于rust - 将模式作为函数参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61833743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com