gpt4 book ai didi

rust - 结构内部的模式匹配

转载 作者:行者123 更新时间:2023-11-29 08:00:27 24 4
gpt4 key购买 nike

我想在不构建新结构的情况下使用模式匹配来检查结构的内部。我正在尝试交换结构的值作为练习(我知道 mem::swap 存在)。

交换意味着匹配结构的值,然后交换匹配的值。比如让 x = {10,20,30}; x.swap(10,30) 应该产生 {30,20,10}

我想做却做不到的事

#[derive(Debug, Clone, Copy)]
struct Color {
r: u8,
g: u8,
b: u8,
a: u8,
}

impl Color {
fn swap(mut self, first: u8, second: u8) -> Color {
match (first) {
self.r => {
match (second) {
self.b => {
self.r = second;
self.b = first;
},
self.g => {
self.r = second;
self.g = first;
},
self.a => {
self.r = second;
self.a = first;
},
_ => {},
}
},
_ => {}
}

Color {
r: self.r,
g: self.g,
b: self.b,
a: self.a,
}
}
}
fn main() {
let c = Color {
r: 255,
g: 200,
b: 10,
a: 30,
};

let color = c.swap(c.r, c.a);

println!("{:?}", color);
}

代码无效,这是我想要完成的。有没有办法做到这一点?我想我已经偏离了这种方法。

最佳答案

从技术上讲,有一种方法可以通过模式匹配来做到这一点,但您可能永远不会在实践中看到它。缺少的部分是使用 match guard :

match first {
v if v == self.r => {
match second {
v if v == self.b => {
self.r = second;
self.b = first;
},
v if v == self.g => {
self.r = second;
self.g = first;
},
v if v == self.a => {
self.r = second;
self.a = first;
},
_ => {},
}
},
_ => {}
}

但这并没有真正使用模式匹配的任何有用部分;它只是一堆 if else 子句:

if first == self.r {
if second == self.b {
self.r = second;
self.b = first;
} else if second == self.g {
self.r = second;
self.g = first;
} else if second == self.a {
self.r = second;
self.a = first;
}
}

不过,您可以选择某些模式的鞋拔:

let x1 = (first == self.r, first == self.g, first == self.b, first == self.a);
let x2 = (second == self.r, second == self.g, second == self.b, second == self.a);

match (x1, x2) {
((true, _, _, _), (_, true, _, _)) => {
self.r = second;
self.b = first;
}
((true, _, _, _), (_, _, true, _)) => {
self.r = second;
self.g = first;
}
((true, _, _, _), (_, _, _, true)) => {
self.r = second;
self.a = first;
}
_ => {}
}

关于rust - 结构内部的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43670027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com