作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码编译失败并出现以下错误:
enum Test {
C(i32),
}
fn main() {
let mut v = Vec::new();
v.push(Test::C(0));
if let Some(Test::C(ref mut c)) = v.last_mut() {
*c = *c + 1;
}
}
error[E0308]: mismatched types
--> src/main.rs:10:17
|
10 | if let Some(Test::C(ref mut c)) = v.last_mut() {
| ^^^^^^^^^^^^^^^^^^ expected &mut Test, found enum `Test`
|
= note: expected type `&mut Test`
found type `Test`
last_mut()
返回可变引用,我将 i32
作为可变引用。我已尝试如下所示使可变性更加清晰,但我遇到了相同的编译器错误。
if let Some(ref mut e) = v.last_mut() {
if let Test::C(ref mut c) = e {
*c = *c + 1;
}
}
为什么这行不通?
最佳答案
您只需要准确匹配错误消息中的内容即可。它需要一个 &mut Test
,所以你应该匹配它:
if let Some(&mut Test::C(ref mut c)) = v.last_mut() {
// ^^^^^^
*c = *c + 1;
}
在这里it is running in the playground .
截至Rust 1.26 ,您的原始代码按原样工作,不再需要显式 ref
和 ref mut
关键字:
if let Some(Test::C(c)) = v.last_mut() {
*c = *c + 1;
}
关于rust - 改变存储在 Vec 枚举中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47170186/
我是一名优秀的程序员,十分优秀!