gpt4 book ai didi

rust - 在可变选项内的值上调用方法

转载 作者:行者123 更新时间:2023-11-29 07:55:44 25 4
gpt4 key购买 nike

我有一个可变的 Option 类型,我正在尝试改变 Some 中的内容,但我不知道该怎么做。

use std::net::TcpStream;
use std::io::Write;

struct Foo {
stream: Option<TcpStream>,
}

impl Foo {
fn send(&mut self) {
self.stream.map(|x| x.write(b"test")).expect("Couldn't write");
}
}

这会产生错误:

error[E0596]: cannot borrow immutable argument `x` as mutable
--> src/main.rs:10:29
|
10 | self.stream.map(|x| x.write(b"test")).expect("Couldn't write");
| - ^ cannot borrow mutably
| |
| consider changing this to `mut x`

有人可以尝试实现 send 作为例子来帮助我理解吗?

最佳答案

作为Vladimir Matveev points out , if let 比遍历 Option 更好,而且更惯用:

#[derive(Debug)]
struct Foo {
stream: Option<i32>,
}

impl Foo {
fn send(&mut self) {
if let Some(ref mut x) = self.stream {
*x += 1;
}
}
}

fn main() {
let mut f = Foo { stream: Some(0) };
println!("{:?}", f);

f.send();
println!("{:?}", f);
}

从 Rust 1.26 开始,match ergonomics 允许您省略一些关键字:

impl Foo {
fn send(&mut self) {
if let Some(x) = &mut self.stream {
*x += 1;
}
}
}

在那之前,我通常会使用 Option::as_mut :

impl Foo {
fn send(&mut self) {
if let Some(x) = self.stream.as_mut() {
*x += 1;
}
}
}

其他选项

正如 Vladimir Matveev(再次!)指出的那样,map 通常用于转换 数据,而不是用于副作用(我同意这一点)。您可以改为使用 iter_mut(或 &mut collection 的简写),因为我觉得迭代通常是为了产生副作用。我喜欢这样,因为这意味着我们的代码可以避免有条件:

impl Foo {
fn send(&mut self) {
for x in &mut self.stream {
*x += 1;
}
}
}

您还可以利用 OptionIntoIterator 实现:

impl Foo {
fn send(&mut self) {
for x in self.stream.as_mut() {
*x += 1;
}
}
}

关于rust - 在可变选项内的值上调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361350/

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