作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样一个例子:
pub enum Foo {
Foo1(Foo1),
Foo2(Foo2),
Foo3(Foo3),
}
pub type Foo1 = Bar<I1>;
pub type Foo2 = Bar<I2>;
struct Bar<I>{
var: I,
...
}
impl Bar{
fn do(word: &str){
...
}
}
match
块的函数:
match something {
Foo::Foo1(inner) => {
inner.do(a_word)
}
Foo::Foo2(inner) => {
inner.do(a_word)
}
_ => {
(...)
}
}
inner
是
Bar
结构,但在
Foo1
和
Foo2
中不同:
inner
用于
Foo1
:
Bar<I1>
inner
用于
Foo2
:
Bar<I2>
something
匹配
Foo1
和
Foo2
时的操作是完全相同的,但是重复两次相同的操作不是很优雅。
match something {
Foo::Foo1(inner) | Foo::Foo2(inner)=> {
inner.do(a_word)
_ => {
(...)
}
}
inner
和
Foo1
中的
Foo2
是不同类型的(如前所述)
Foo1
和
Foo2
紧密地匹配起来呢?
最佳答案
我假设有时您希望对Foo项运行相同的操作,而不考虑变量,而有时您希望根据变量更改逻辑。对于第二种情况,我不认为有任何方法可以绕过匹配块,或者,如果您只关心一个变量,则可以使用类似的方法:
if let Foo::Foo1(inner) = &foo {
&inner.do_something(a_word);
}
Bar<I>
的引用:
fn get_inner(&self) -> &Bar<I> {
match self {
Foo::Foo1(inner) | Foo::Foo2(inner) | Foo::Foo3(inner) => inner,
}
}
foo.get_inner().do_something(a_word);
Option<&Bar<I>>
。
fn run(&self, value: &str, f: &Fn(&Bar<I>, &str) -> ()) {
f(self.get_inner(), value);
}
Bar<I>
上的一个方法,它引用一个字符串片段。可以这样称呼:
foo.run(a_word, &Bar::do_something);
#![allow(dead_code)]
fn main() {
match_enum();
}
pub type Foo1<I1> = Bar<I1>;
pub type Foo2<I2> = Bar<I2>;
pub type Foo3<I3> = Bar<I3>;
pub struct Bar<I> {
var: I,
}
impl<I> Bar<I> {
fn do_something(&self, word: &str) {
println!("\nBar.do_something(): {}", word);
}
}
pub enum Foo<I> {
Foo1(Foo1<I>),
Foo2(Foo2<I>),
Foo3(Foo3<I>),
}
impl<I> Foo<I> {
fn get_inner(&self) -> &Bar<I> {
match self {
Foo::Foo1(inner) | Foo::Foo2(inner) | Foo::Foo3(inner) => inner,
}
}
fn run(&self, value: &str, f: &Fn(&Bar<I>, &str) -> ()) {
f(self.get_inner(), value);
}
}
fn match_enum() {
let a_word = "abc";
let foo = Foo::Foo1(Bar { var: "foo1_bar" });
// Call a function only for certain variants of Foo:
match &foo {
Foo::Foo1(inner) => {
&inner.do_something(a_word);
}
Foo::Foo2(inner) => {
&inner.do_something(a_word);
}
_ => {}
}
// Call a function only for one variant of Foo:
if let Foo::Foo1(inner) = &foo {
&inner.do_something(a_word);
}
// Call a function regardless of the variant of Foo:
foo.get_inner().do_something(a_word);
// As above but using a function that could have been chosen
// at runtime:
foo.run(a_word, &Bar::do_something);
}
match &foo {
Foo::Foo1(inner) | Foo::Foo2(inner) => {
&inner.do_something(a_word);
}
_ => {}
}
inner
在Foo1和Foo2中都不是同一类型。所以我一定是用和你的代码不匹配的方式设置的。你能把Foo,Foo1,Foo2,Foo3和Bar的完整定义贴出来吗?
关于rust - 将具有相同泛型的相同结构的枚举匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57480977/
我是一名优秀的程序员,十分优秀!