rust学习-打印结构体中的vec

这篇具有很好参考价值的文章主要介绍了rust学习-打印结构体中的vec。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

write! 宏

将格式化后的数据写入到一个缓冲区(buffer),而不是直接打印到标准输出或文件中。
这个缓冲区可以是字符串,也可以是需要写入的文件的缓冲区。

write!(writer, format_string, expr1, expr2, ...);

writer 参数是一个实现了 std::io::Write trait 的对象,表示要将数据写入到哪里。

format_string 是一个格式化字符串,可以包含占位符 {},表示后面要插入的值。 expr1、expr2 等是值的表达式,可以是变量,常量,函数等。

write! 宏不会自动添加末尾的换行符。如果需要在写入缓冲区后添加换行符,可以在格式化字符串末尾添加 “\n”。

use std::io::Write;

fn main() {
    let mut buffer = Vec::new(); // 创建一个空的缓冲区

    let n = 123;
    // 使用 write! 宏将格式化字符串 n = {}\n 写入到一个空的缓冲区 buffer 中
    // 使用 unwrap() 方法处理写入缓冲区时可能出现的错误
    write!(&mut buffer, "n = {}\n", n).unwrap();

	// 使用 String::from_utf8_lossy() 方法将缓冲区的内容转换为字符串格式,并进行输出
    println!("{}", String::from_utf8_lossy(&buffer));
}

// 打印内容
// n = 123
// \n

write! 宏的返回值是一个 std::io::Result<()> 类型的值,表示写入操作是否成功。

  • 执行成功时,它返回一个包含 () 值的 Ok 枚举成员
  • 执行失败时,它会返回一个包含错误信息的 Err 枚举成员
use std::io::Write;

fn main() {
	// 创建一个缓冲区
    let mut buffer = Vec::new();
    let n = 123;
    
     // 调用 write! 宏写入数据
    let result = write!(&mut buffer, "n = {}\n", n);

    if result.is_err() {
    	// unwrap_err 只能在err的时候使用
        println!("Error: {}", result.unwrap_err());
    } else {
        println!("Write succeed.");
        println!("{:?}", buffer);
    }
}

// 打印
// Write succeed.
// [110, 32, 61, 32, 49, 50, 51, 10]
  • 如果发现错误,使用 unwrap_err() 方法获取错误信息并进行输出
  • 如果没有出现错误,输出信息 “Write succeed.”。

打印结构体中的vec

use std::fmt; // 导入 `fmt` 模块。

// 定义一个包含单个 `Vec` 的结构体 `List`。
struct List(Vec<i32>);

impl fmt::Display for List {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // 使用元组的下标获取值,并创建一个 `vec` 的引用
        // 创建一个指向结构体 List 中第一个元素的不可变引用
		// self 是一个 &List 类型的引用,它表示一个指向类型为 List 的结构体实例的引用
		// .0 表示取得 List 结构体中的第一个元素
		// 必须使用 &self.0 来获取 List 这个引用所指向的 Vec<i32> 实例
        let vec = &self.0;

		// ? 运算符,表示在发生错误时返回错误信息
		// 这样在上层函数中可以进行进一步的处理
		// ? 运算符只有在当前函数返回 Result 类型时才能使用
        write!(f, "[")?;

        // 使用 `v` 对 `vec` 进行迭代,并用 `count` 记录迭代次数。
        for (count, v) in vec.iter().enumerate() {
            // 对每个元素(第一个元素除外)加上逗号。
            // 使用 `?` 或 `try!` 来返回错误。
            if count != 0 { write!(f, ", ")?; }
            write!(f, "{}", v)?;
        }

        // 加上配对中括号,并返回一个 fmt::Result 值
        write!(f, "]")
    }
}

fn main() {
    let v = List(vec![1, 2, 3]);
    println!("{}", v);
}

按照 k-v的形式打印

use std::fmt; // 导入 `fmt` 模块。

// 定义一个包含单个 `Vec` 的结构体 `List`。
struct List(Vec<i32>);

impl fmt::Display for List {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // 使用元组的下标获取值,并创建一个 `vec` 的引用
        // 创建一个指向结构体 List 中第一个元素的不可变引用
		// self 是一个 &List 类型的引用,它表示一个指向类型为 List 的结构体实例的引用
		// .0 表示取得 List 结构体中的第一个元素
		// 必须使用 &self.0 来获取 List 这个引用所指向的 Vec<i32> 实例
        let vec = &self.0;

		// ? 运算符,表示在发生错误时返回错误信息
		// 这样在上层函数中可以进行进一步的处理
		// ? 运算符只有在当前函数返回 Result 类型时才能使用
        write!(f, "[")?;

        // 使用 `v` 对 `vec` 进行迭代,并用 `count` 记录迭代次数。
        for (count, v) in vec.iter().enumerate() {
            // 对每个元素(第一个元素除外)加上逗号。
            // 使用 `?` 或 `try!` 来返回错误。
            if count != 0 { write!(f, ", ")?; }
            write!(f, "{}: {}", count, v)?;
        }

        // 加上配对中括号,并返回一个 fmt::Result 值
        write!(f, "]")
    }
}

fn main() {
    let v = List(vec![1, 2, 3]);
    println!("{}", v);
}

附录

unwrap 和 unwrap_err

  • unwrap() 方法用于从 Ok 枚举成员中取出存储的值,如果结果是 Err 枚举成员,则会引发 panic
  • unwrap_err() 方法用于从 Err 枚举成员中取出存储的错误信息,如果结果是 Ok 枚举成员,则会引发 panic。该方法主要用于在程序发生错误时对错误信息进行记录和处理,避免程序崩溃

display trait

对于 Vec 或其他任意泛型容器(generic container)
fmt::Display 都没有实现。因此在这些泛型的情况下要用 fmt::Debug。文章来源地址https://www.toymoban.com/news/detail-659724.html

use std::fmt; // 导入 `fmt`

// 带有两个数字的结构体
// 推导出 `Debug`,以便与 `Display` 的输出进行比较
#[derive(Debug)]
struct MinMax(i64, i64);

// 实现 `MinMax` 的 `Display`。
impl fmt::Display for MinMax {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // 使用 `self.number` 来表示各个数据。
        write!(f, "({}, {})", self.0, self.1)
    }
}

// 为了比较,定义一个含有具名字段的结构体
#[derive(Debug)]
struct Point2D {
    x: f64,
    y: f64,
}

// 类似地对 `Point2D` 实现 `Display`
impl fmt::Display for Point2D {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // 自定义格式,使得仅显示 `x` 和 `y` 的值。
        write!(f, "x: {}, y: {}", self.x, self.y)
    }
}

fn main() {
    let minmax = MinMax(0, 14);

    println!("Compare structures:");
    println!("Display: {}", minmax);
    println!("Debug: {:?}", minmax);

    let big_range =   MinMax(-300, 300);
    let small_range = MinMax(-3, 3);

    println!("The big range is {big} and the small range is {small}", small = small_range, big = big_range);

    let point = Point2D { x: 3.3, y: 7.2 };
    println!("Compare points:");
    println!("Display: {}", point);
    println!("Debug: {:?}", point);

    // 报错。`Debug` 和 `Display` 都被实现了,但 `{:b}` 需要 `fmt::Binary`
    // 得到实现。这语句不能运行。
    // println!("What does Point2D look like in binary: {:b}?", point);
}

到了这里,关于rust学习-打印结构体中的vec的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • postman获取请求体中的内容

    var 变量名 = JSON.parse(request.data) request.data 为请求体中的数据,使用 JSON.parse 将其转换为对象类型,供后续引用。  上图中的内容写在 Pre-request Script 中,因为获取请求体的操作可以在收到响应数据之前完成, Tests 中的内容是在收到响应之后才执行的。 获取的两个字段内容如下

    2024年02月13日
    浏览(31)
  • 如何根据结构体中成员的地址获取整个结构体的首地址

    根据结构体成员地址,获取整个结构体的首地址,在Linux系统、鸿蒙lite os操作系统中是一个很重要的功能。 在Linux系统中是通过container_of宏函数实现的 container_of通过结构体内某个成员的地址和该成员的名字,以及结构体类型,找到该结构体变量的首地址。 在鸿蒙Lite os中是通

    2024年02月11日
    浏览(28)
  • 【Rust 基础篇】Rust 中的泛型:结构体和方法

    在 Rust 中,泛型是一种强大的特性,可以在结构体和方法中使用通用的类型参数。通过泛型,我们可以编写更加灵活和可复用的代码。本篇博客将详细介绍如何在 Rust 的结构体和方法中使用泛型,包括泛型结构体的定义、泛型方法的实现以及对泛型参数的约束。 在 Rust 中,我

    2024年02月16日
    浏览(30)
  • Rust 语言中的结构体

    目录 1、结构体 2、结构体的定义和实例化 2.1 使用字段初始化简写语法 2.2 使用结构体更新语法从其他实例创建实例 2.3 没有命名字段的元组结构体 2.4 没有任何字段的类单元结构体 2.5 结构体示例程序 3、方法 3.1 关联函数 3.2 多个 impl 块 struct ,或者  structure ,是一个自定义

    2024年02月05日
    浏览(25)
  • Golang结构体中可忽略的字段用什么tag表示

    前言 在写项目的时候,需要实现一个搜索功能,可以通过不同的字段查询数据库中的东西,比如可以通过名字或者介绍或者分类进行查询,但是从前端传回到后端的数据中,需要忽略某些字段在查询中的作用(前端传回来为空的字段)。 于是就想到在结构体中使用tag来选择

    2024年02月16日
    浏览(24)
  • 2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么?

    2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么? 答案2023-05-20: go版本是1.20.4。 扩容流程见源码见runtime/slice.go文件中的 growslice 函数。 growslice 函数的大致过程如下: 1.如果元素类型的大小为零,则返回具有 nil 指针但非零长度的切片。否则,下一步。 2.计算新切片的

    2024年02月05日
    浏览(32)
  • get方法中url参数拼接和写到请求体中的理解

    get方法中url参数拼接和写到请求体中的理解 1.如get的请求参数拼接到了url上那么,他的请求参数body_data给为空,参数类型params,可以执行调用成功 url = ‘http://www.kuaidi100.com/query?type=zhongtongpostid=73116039505988’ body_data={} 2.如get的请求参数没有在url上拼接,写到了body_data中,参数

    2024年02月09日
    浏览(25)
  • 【C++漂流记】结构体的定义和使用、结构体数组、结构体指针、结构体做函数参数以及结构体中const的使用

    结构体(struct)是C语言中一种重要的数据类型,它由一组不同类型的成员组成。结构体可以用来表示一个复杂的数据结构,比如一个学生的信息、一个员工记录或者一个矩形的尺寸等。 结构体定义后,可以声明结构体变量,每个结构体变量包含结构体类型的所有成员。结构

    2024年02月09日
    浏览(30)
  • rust学习-结构体

    结构体需要命名各部分数据以便能清楚的表明其值的意义 结构体比元组更灵活:不需要依赖顺序来指定/访问实例中的值 变量与字段同名时的间写 依据其他实例创建实例 没有具体的字段名,只有字段的类型,但有名称,注意元组没名称 元组结构体实例类似于元组: (1)可

    2024年02月16日
    浏览(14)
  • Rust学习笔记005:结构体 struct

            在 Rust 中, struct 是一种用于创建自定义数据类型的,它允许你定义和组织数据的结构。 struct 可以包含多个不同类型的字段(fields),每个字段都有一个名称和一个类型。         下面是一个简单的例子,展示了如何定义和使用 struct : 元组结构体(

    2024年02月03日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包