我想申请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)
有冗长模式匹配的替代方案吗?我寻找一个宏但找不到合适的宏.
我有一个具有以下结构的枚举:
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代码,它遍历两个枚举实例的所有选项.但是,如果它存在,我正在寻找一个更好的解决方案.如果没有,双重匹配会有开销吗?我想在内部我只是比较两个整数(理想情况下).
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_id为SocketAddrV6. 但是,我没有SocketAddrV6,我只有一个SocketAddr没有实现scope_id().
我可以调用is_ipv6()它SocketAddr,以查看它是什么类型。如果是IPV6,那么用C语言来说,我想投射到底层SocketAddrV6,所以我可以调用set_scope_id()它。然后我想将结果SocketAddr或SocketAddrV6变量传递给bind().
以下显然仅适用于原始类型:
let addr2 = addr as SocketAddrV6
Run Code Online (Sandbox Code Playgroud)
如果我尝试进行隐式转换,则会出现类型不匹配错误。我想它告诉我这addr是一个枚举,而不是一个SocketAddrV6结构。我知道。我如何在 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 文档给出了这个示例,其中我们有一个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没有模式匹配的情况下阅读?甚至没有在运行时检查内容的类型怎么样?也许我们以某种方式绝对肯定地知道包含什么类型,或者我们可能只是一个糟糕的程序员.在任何一种情况下,我只是想知道它是否可能,而不是它是一个好主意.
它让我觉得这是一个非常有趣的语言特征,这个分支是如此困难(或不可能?)来避免.