use std::io::Write;
fn main() {
    let mut x = [0u8; 10];
    let mut y = &mut x[..];
    y.write(b"1");
    y.write(b".");
    println!("{:p}", y);
    println!("{:?}", y);
    println!("{:?}", x);
}

我得到以下输出

0x7ffeddab2b8a
[0, 0, 0, 0, 0, 0, 0, 0]
[49, 46, 0, 0, 0, 0, 0, 0, 0, 0]

我认为println!("{:?}", y);应该打印出地址值或底层数据的值.但它不会在这两个选项中做任何事情.(阅读堆栈溢出-Why does printing a pointer print the same thing as printing the dereferenced pointer?上的答案时,我认为它应该打印出xie [49, 46, 0, 0, 0, 0, 0, 0, 0, 0] 的值)

我的问题是

  1. 当我们使用print语句打印y时,[0, 0, 0, 0, 0, 0, 0, 0]指的是什么?
  2. 如何打印y的基础值(仅使用y)?
  3. 有没有人能解释一下为什么它打印[0,0,0,0,0,0,0,0]

推荐答案

您的代码使用了std::io::Write for &mut [u8]的实现.当你写y.write(...)时,你调用了write方法,它接受&mut self,也就是说,write接收对y的可变引用.为了使每个write调用不互相覆盖,write mutates通过从切片的头部移除刚写入的范围来对切片进行操作.在向切片写入n个字节之后,切片的数据指针递增n,切片的长度递减n.

  1. 当我们使用print语句打印y时,[0, 0, 0, 0, 0, 0, 0, 0]指的是什么?

  2. 有没有人能解释一下为什么它打印[0,0,0,0,0,0,0,0]

它指的是缓冲区中的剩余空间.请注意,只有8个零,因为您在10字节的缓冲区中写入了2个字节.

  1. 如何打印y的基础值(仅使用y)?

您在缓冲区中写入的数据不能通过y访问,因为y指向缓冲区的其余部分.

为了获得写入缓冲区的数据片段,您需要编写如下代码:

use std::io::Write;

fn main() {
    let mut x = [0u8; 10];
    let mut y = &mut x[..];
    y.write(b"1");
    y.write(b".");

    let y_len = y.len();
    let len = x.len() - y_len;
    println!("{:?}", &x[0..len]);
}

Rust相关问答推荐

使用Rust s serde_json对混合数据类型进行优化'

如何创建引用构造函数拥有的变量的对象?

在泛型 struct 的字段声明中访问关联的Conant

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

如果成员都实现特征,是否在多态集合上实现部分重叠的特征?

在UdpSocket上使用sendto时的隐式套接字绑定

无法将记录器向下转换回原始 struct

当T不执行Copy时,如何返回Arc Mutex T后面的值?

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

可以为rust构建脚本编写单元测试吗?

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

使用关联类型重写时特征的实现冲突

如何迭代属性以判断相等性?

如何重命名 clap_derive 中的子命令占位符?

Rust LinkedList 中的borrow 判断器错误的原因是什么?

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

如何从 x86_64 Mac 构建 M1 Mac?

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

如何在 Rust 中将 bson::Bson 转换为 Vec