相关疑难解决方法(0)

如何在没有模式匹配的情况下比较枚举

我想申请filter一个迭代器,我想出了这个并且它可以工作,但它超级详细:

.filter(|ref my_struct| match my_struct.my_enum { Unknown => false, _ => true })
Run Code Online (Sandbox Code Playgroud)

我宁愿写这样的东西:

.filter(|ref my_struct| my_struct.my_enum != Unknown)
Run Code Online (Sandbox Code Playgroud)

这给了我一个编译错误

binary operation `!=` cannot be applied to type `MyEnum`
Run Code Online (Sandbox Code Playgroud)

有冗长模式匹配的替代方案吗?我寻找一个宏但找不到合适的宏.

enums pattern-matching rust

30
推荐指数
4
解决办法
2万
查看次数

仅按变体比较枚举,而不是值

我有一个具有以下结构的枚举:

enum Expression {
    Add(Add),
    Mul(Mul),
    Var(Var),
    Coeff(Coeff)
}
Run Code Online (Sandbox Code Playgroud)

每个变体的"成员"都是结构.

现在我想比较两个枚举是否有相同的变体.所以,如果我有

let a = Expression::Add({something});
let b = Expression::Add({somethingelse});
Run Code Online (Sandbox Code Playgroud)

cmpvariant(a, b)应该是true.我可以想象一个简单的双重match代码,它遍历两个枚举实例的所有选项.但是,如果它存在,我正在寻找一个更好的解决方案.如果没有,双重匹配会有开销吗?我想在内部我只是比较两个整数(理想情况下).

rust

20
推荐指数
1
解决办法
4454
查看次数

如何将 Rust 变体枚举转换为底层结构?

bind()下面的调用适用于 IPV4,但不适用于 IPV6。

pub enum SocketAddr {
    V4(SocketAddrV4),
    V6(SocketAddrV6),
}

pub fn new<A: ToSocketAddrs>(local_addr: A, _: Option<u32>) -> io::Result<UdpConnector> {
    let mut addr = net::addr_from_trait(local_addr)?;
    debug!("Attempting to connect to {:?}", addr);
    UdpSocket::bind(addr).expect(&format!("Couldn't bind to address {:?}", addr))
}
Run Code Online (Sandbox Code Playgroud)

我认为我需要scope_idSocketAddrV6. 但是,我没有SocketAddrV6,我只有一个SocketAddr没有实现scope_id().

我可以调用is_ipv6()SocketAddr,以查看它是什么类型。如果是IPV6,那么用C语言来说,我想投射到底层SocketAddrV6,所以我可以调用set_scope_id()它。然后我想将结果SocketAddrSocketAddrV6变量传递给bind().

我试过的

以下显然仅适用于原始类型:

let addr2 = addr as SocketAddrV6
Run Code Online (Sandbox Code Playgroud)

如果我尝试进行隐式转换,则会出现类型不匹配错误。我想它告诉我这addr是一个枚举,而不是一个SocketAddrV6结构。我知道。我如何在 Rust …

rust

5
推荐指数
0
解决办法
1305
查看次数

如何检查错误类型是否与 Rust 中的特定错误类型匹配?

所以我有这个自定义错误,

use std::fmt;

#[derive(Debug)]
pub enum XError {
  TagNotFound,
}

impl std::error::Error for XError {}

impl fmt::Display for XError {
  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    match self {
      XError::TagNotFound => write!(f, "couldn't find tag"),
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个函数pub fn validate() -> Result<String, Box<dyn std::error::Error>>

现在在我的测试中,如何检查validateis返回的错误XError::TagNotFound

我尝试做,

let b = validate(param)
  .unwrap_err()
  .downcast_ref::<XError::TagNotFound>();
Run Code Online (Sandbox Code Playgroud)

但我明白了expected type, found variant "XError::TagNotFound" not a type

rust

3
推荐指数
1
解决办法
1515
查看次数

从没有模式匹配的枚举中读取

Rust 文档给出了这个示例,其中我们有一个Result<T, E>named 实例some_value:

match some_value {
    Ok(value) => println!("got a value: {}", value),
    Err(_) => println!("an error occurred"),
}
Run Code Online (Sandbox Code Playgroud)

有没有方法可以在some_value没有模式匹配的情况下阅读?甚至没有在运行时检查内容的类型怎么样?也许我们以某种方式绝对肯定地知道包含什么类型,或者我们可能只是一个糟糕的程序员.在任何一种情况下,我只是想知道它是否可能,而不是它是一个好主意.

它让我觉得这是一个非常有趣的语言特征,这个分支是如此困难(或不可能?)来避免.

enums discriminated-union rust

2
推荐指数
1
解决办法
2161
查看次数