小编war*_*ock的帖子

如何在没有样板代码的情况下创建只读结构?

尽管Rust已经吸收了许多优秀的现代编程思想,但它看起来并没有呈现出一个非常基本的特征.

现代(伪)功能代码基于以下类型的大量类:

pub struct NamedTuple {
    a: i8,
    b: char,
}
impl NamedTuple {
    fn new(a: i8, b: char) -> NamedTuple {
        NamedTuple { a: a, b: b }
    }
    fn a(&self) -> i8 {
        self.a
    }
    fn b(&self) -> char {
        self.b
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,这里有很多样板代码.没有样板代码,真的没有办法简单地描述这些类型吗?

functional-programming rust

5
推荐指数
2
解决办法
409
查看次数

是否可以编写一个调用BufRead :: fill_buf的函数,直到使用不安全的方法不再发生中断的错误为止?

是否可以编写一个函数,BufRead::fill_buf直到io::ErrorKind::Interrupted使用不安全方法调用该函数直到不再发生?

使用不安全的代码,它是:

use std::{
    io::{self, BufRead},
    slice,
};

fn fill_buf_and_ignore_interrupts(reader: &mut impl BufRead) -> io::Result<&[u8]> {
    let (buf_ptr, buf_len) = loop {
        match reader.fill_buf() {
            Ok(buf) => (buf.as_ptr(), buf.len()),
            Err(e) => {
                if e.kind() != io::ErrorKind::Interrupted {
                    return Err(e);
                }
            }
        }
    };
    Ok(unsafe { slice::from_raw_parts(buf_ptr, buf_len) })
}
Run Code Online (Sandbox Code Playgroud)

如果尝试使用returnbreak Ok(buf),则从借阅检查器收到错误消息:

error[E0499]: cannot borrow `*reader` as mutable more than once at a time
 --> src/lib.rs:8:15
  |
6 | fn fill_buf_and_ignore_interrupts(reader: &mut impl …
Run Code Online (Sandbox Code Playgroud)

loops rust borrow-checker

0
推荐指数
1
解决办法
499
查看次数