提问人:ewoolsey 提问时间:1/11/2022 最后编辑:John Kugelmanewoolsey 更新时间:1/11/2022 访问量:1080
有没有办法将函数评估为匹配臂的输入?
Is there a way to evaluate a function as the input to a match arm?
问:
match input_string {
func_that_returns_string(MyEnum::MyVariant1) => do_something(),
func_that_returns_string(MyEnum::MyVariant2) => do_something_else(),
_=> do_nothing(),
}
以下是错误消息的示例:
错误:预期的元组结构或元组变体,找到函数func_that_returns_string
答:
6赞
Alexey S. Larionov
1/11/2022
#1
好吧,您可以使用火柴后卫来做到这一点,它看起来像x if condition =>
fn fun(variant: MyEnum) -> String {
match variant {
MyEnum::Variant1 => "String1".to_string(),
MyEnum::Variant2 => "String2".to_string(),
}
}
pub fn main() {
let s = "String2".to_string();
match s {
s if s == fun(MyEnum::Variant1) => do_something(1),
s if s == fun(MyEnum::Variant2) => do_something(2),
_ => {},
}
// prints 2
}
但无论哪种方式,它看起来都很笨拙,我建议你修改你的设计。
评论
0赞
ewoolsey
1/11/2022
是的,它很笨拙......太糟糕了。我上面的代码不起作用似乎有点违反直觉。
0赞
Alexey S. Larionov
1/11/2022
我想匹配表达式的编译开销很小,因为它们是静态的。虽然使用任意函数的结果无法优化,但匹配后卫也是如此
4赞
Sven Marnach
1/11/2022
每个火柴臂中箭头前面的部分是一个图案,而不是一个表达式。函数调用在模式中没有多大意义——它不是可以匹配的真正模式。
0赞
Stargateur
1/11/2022
如果你问我 match guard 是无用的,并且使代码难以阅读,编写时间更长
0赞
Caesar
1/11/2022
火柴后卫有其用途,但这不是其中之一。
上一个:获取 YT 视频、频道或无
下一个:如何匹配子字符串的多个匹配项
评论
FromStr for MyEnum
match input_string.parse::<MyEnum>()
Ok(MyEnum::MyVariant1)
Err(_)
match
ARMS 必须是模式,这些模式或多或少是文字值,您可以通过模式匹配从中提取数据。An 会更适合您正在做的事情,尽管您实际上尝试做的是将字符串映射到变体?在这种情况下,您可能想要 的倒数。if-else
MyEnum
func_that_returns_string