减少深层嵌套属性的匹配缩进
Reducing match indentation for deeply nested properties
我需要引用结构深处的值,该结构包括嵌套在 struct
属性 中的 Option
,嵌套在 Result
.[=15 中=]
我目前的(有效)解决方案是:
let raw = &packet[16..];
match PacketHeaders::from_ip_slice(raw) {
Err(_value) => {
/* ignore */
},
Ok(value) => {
match value.ip {
Some(Version4(header)) => {
let key = format!("{}.{}.{}.{},{}.{}.{}.{}",
header.source[0], header.source[1], header.source[2], header.source[3],
header.destination[0], header.destination[1], header.destination[2], header.destination[3],
);
let Count {packets, bytes} = counts.entry(key).or_insert(Count {packets: 0, bytes: 0});
*packets += 1;
*bytes += packet.len();
if p > 1000 { /* exit after 1000 packets */
for (key, value) in counts {
println!("{},{},{}", key, value.packets, value.bytes);
}
return ();
}
p += 1;
}
_ => {
/* ignore */
}
}
}
}
(我现在代码的问题是过多的嵌套和两个匹配。)
我想要的只是PacketHeaders::from_ip_slice(ip) >> Ok >> ip >> Some >> Version4
.
我怎样才能得到这个,或者很好地忽略每个捕获的数据包的失败(不是 crash/exit)?
模式匹配嵌套,struct 的模式看起来像结构文字加上 ..
表示 "and match all the rest, which I don't care about",类似于 _
模式表示 "match anything" .这意味着你可以做到
match PacketHeaders::from_ip_slice(raw) {
Ok(PacketHeaders { ip: Version4(header), .. }) => {
/* handle */
}
_ => {
/* ignore `Err(_)` and other `Ok(_)` */
},
}
如果您要忽略除一种情况以外的所有情况,您可以使用 if let
:
if let Ok(PacketHeaders { ip: Version4(header), .. }) = PacketHeaders::from_ip_slice(raw) {
/* handle */
}
代码最终为:
let raw = &packet[16..];
if let Ok(PacketHeaders { ip: Some(Version4(header)), link: _, vlan: _, transport: _, payload: _}) = PacketHeaders::from_ip_slice(raw) {
let key = format!("{}.{}.{}.{},{}.{}.{}.{}",
header.source[0], header.source[1], header.source[2], header.source[3],
header.destination[0], header.destination[1], header.destination[2], header.destination[3],
);
let Count {packets, bytes} = counts.entry(key).or_insert(Count {packets: 0, bytes: 0});
*packets += 1;
*bytes += packet.len();
}
我需要引用结构深处的值,该结构包括嵌套在 struct
属性 中的 Option
,嵌套在 Result
.[=15 中=]
我目前的(有效)解决方案是:
let raw = &packet[16..];
match PacketHeaders::from_ip_slice(raw) {
Err(_value) => {
/* ignore */
},
Ok(value) => {
match value.ip {
Some(Version4(header)) => {
let key = format!("{}.{}.{}.{},{}.{}.{}.{}",
header.source[0], header.source[1], header.source[2], header.source[3],
header.destination[0], header.destination[1], header.destination[2], header.destination[3],
);
let Count {packets, bytes} = counts.entry(key).or_insert(Count {packets: 0, bytes: 0});
*packets += 1;
*bytes += packet.len();
if p > 1000 { /* exit after 1000 packets */
for (key, value) in counts {
println!("{},{},{}", key, value.packets, value.bytes);
}
return ();
}
p += 1;
}
_ => {
/* ignore */
}
}
}
}
(我现在代码的问题是过多的嵌套和两个匹配。)
我想要的只是PacketHeaders::from_ip_slice(ip) >> Ok >> ip >> Some >> Version4
.
我怎样才能得到这个,或者很好地忽略每个捕获的数据包的失败(不是 crash/exit)?
模式匹配嵌套,struct 的模式看起来像结构文字加上 ..
表示 "and match all the rest, which I don't care about",类似于 _
模式表示 "match anything" .这意味着你可以做到
match PacketHeaders::from_ip_slice(raw) {
Ok(PacketHeaders { ip: Version4(header), .. }) => {
/* handle */
}
_ => {
/* ignore `Err(_)` and other `Ok(_)` */
},
}
如果您要忽略除一种情况以外的所有情况,您可以使用 if let
:
if let Ok(PacketHeaders { ip: Version4(header), .. }) = PacketHeaders::from_ip_slice(raw) {
/* handle */
}
代码最终为:
let raw = &packet[16..];
if let Ok(PacketHeaders { ip: Some(Version4(header)), link: _, vlan: _, transport: _, payload: _}) = PacketHeaders::from_ip_slice(raw) {
let key = format!("{}.{}.{}.{},{}.{}.{}.{}",
header.source[0], header.source[1], header.source[2], header.source[3],
header.destination[0], header.destination[1], header.destination[2], header.destination[3],
);
let Count {packets, bytes} = counts.entry(key).or_insert(Count {packets: 0, bytes: 0});
*packets += 1;
*bytes += packet.len();
}