Rust格式化输出方式总结

2025-02-26 17:50

本文主要是介绍Rust格式化输出方式总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}...

Rust格式化输出方式

Rust的格式化输出是通过std::fmt模块提供的强大功能来实现的。

Rust提供了灵活且dYcvH功能强大的格式化字符串语法,允许开发者根据需求输出不同类型的数据。

基本的格式化输出

Rust中最常用的格式化输出方法是使用println!和format!宏。

这些宏通过std::fmt::Display和std::fmt::Debug trwww.chinasem.cnait来控制输出的格式。

  • print!将格式化文本输出到标准输出,不带换行符
  • println!同上,但是在行的末尾添加换行符
  • format!将格式化文本输出到String字符串

1.使用println!宏

let name = "Alice";
let age = 30;
//{} 是占位符,它会被后续传入的变量name和age替换  
println!("Hello, my name is {} and I am {} years old.", name, age); 

使用format!宏

  • format!用法与println!类似,不过它返回一个格式化的String而不是直接输出。
  • format!宏在生成字符串时很有用,特别是当你需要在多个地方使用格式化字符串时。
let name = "Alice";
let age = 30;
let message = format!("Hello, my name is {} and I am {} years old.", name, age);
println!("{}", message);

格式化占位符

Rust的格式化占位符{}有多种变体,用于处理不同的数据类型和输出需求。

1.默认显示格式:{}

{}是最常见的占位符,适用于实现了Display trait的类型,比如字符串和大多数数值类型。

let x = 10;
println!("The value of x is {}", x);

2.调试格式{:?} 和 {:#?}

对于Debug trait类型的变量使用{:?}来打印它们的www.chinasem.cn调试信息。

例如结构体、枚举和集合类型通常需要Debug trait来实现。

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

let p = Point { x: 1, y: 2 };
println!("Debug output: {:?}", p);

{:#?}会以更具可读性的格式打印数据(通常用于打印集合和结构体等复杂类型)

println!("Pretty Debug: {:#?}", p);

3.自定义格式{:<width}、{:>width}和{:^width}

  • {:<width}:左对齐
  • {:www.chinasem.cn>width}:右对齐
  • {:^width}:居中对齐
//填充对齐
fn main() {
    // 以下全部都会补齐5个字符的长度
    // 左对齐 => Hello x    !
    println!("Hello {:<5}!", "x");
    // 右对齐 => Hello     x!
    println!("Hello {:>5}!", "x");
    // 居中对齐 => Hello   x  !
    println!("Hello {:^5}!", "x");
    // 对齐并使用指定符号填充 => Hello x&&&&!
    // 指定符号填充的前提条件是必须有对齐字符
    println!("Hello {:&<5}!", "x");
}

4.指定精度 {:.precision}

对于浮点数,可以使用 {:.precision} 来控制小数点后的位数。

let pi = 3.141592653589793;
println!("Pi with 2 decimals: {:.2}", pi); // 输出:3.14

//精度可以用于控制浮点数的精度或者字符串的长度  
fn main() {
    let v = 3.1415926;
    //保留小数点后两位 => 3.14
    println!("{:.2}", v);
    //带符号保留小数点后两位 => +3.14
    println!("{:+.2}", v);
    //不带小数 => 3
    println!("{:.0}", v);
    //通过参数来设定精度 => 3.1416,相当于{:.4}
    println!("{:.1$}", v, 4);

    let s = "hi我是Sunface飞飞";
    //保留字符串前三个字符 => hi我
    println!("{:.3}", s);
    //{:.*}接收两个参数,第一个是精度,第二个是被格式化的值 => Hello abc!
    println!("Hello {:.*}!", 3, "abcdefg");
}

5.带符号的格式 {:+}和{:0>width}

  • {:+}: 如果值是正数,显示+符号
  • {:0>width}: 数字宽度不足时,用0填充 右对齐。
//固定符号填充 
fn main() {
    // 宽度是5 => Hello     5!
    println!("Hello {:5}!", 5);
    // 显式的输出正号 => Hello +5!
    println!("Hello {:+}!", 5);
    // 宽度5,使用0进行填充 => Hello 00005!
    println!("Hello {:05}!", 5);
    // 负号也要占用一位宽度 => Hello -0005!
    println!("Hello {:05}!", -5);
}

6.十六进制、二进制、八进制格式:{:x}、{:X}、{:b}、{}

//进制
//#b, 二进制
//#o, 八进制
//#x, 小写十六进制
//#X, 大写十六进制
//x, 不带前缀的小写十六进制
fn main() {
    // 二进制 => 0b11011!
    println!("{:#b}!", 27);
    // 八进制 => 0o33!
    println!("{:#o}!", 27);
    // 十进制 => 27!
    println!("{}!", 27);
    // 小写十六进制 => 0x1b!
    println!("{:#x}!", 27);
    // 大写十六进制 => 0x1B!
    println!("{:#X}!", 27);

    // 不带前缀的十六进制 => 1b!
    println!("{:x}!", 27);

    // 使用0填充二进制,宽度为10 => 0b00011011!
    println!("{:#010b}!", 27);
}

7.具名参数输出

//{1},表示用第二个参数替换该占位符(索引从 0 开始)
fn main() {
    println!("{}{}", 1, 2); // =>"12"
    println!("{1}{0}", 1, 2); // =>"21"
    println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");

}
//具名参数  
//带名称的参数必须放在不带名称参数的后面   
fn main() {
    println!("{argument}", argument = "test"); // => "test"
    println!("{name} {}", 1, name = 2); // => "2 1"
    println!("{a} {c} {b}", a = "a", b = 'b', c = 3); // => "a 3 b"
}

Format 特性

Rust的类型系统允许你定义自己的格式化方式。通过实现std::fmt::Display和std::fmt::Debug特性,自定义格式化输出。

1.实现 Display trait

fn main() {
    use std::fmt;
    struct Circle {
    radius: f64,
    }
    impl fmt::Display for Circle {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Circle with radius {:.2}", self.radius)
    }
    }
    let circle = Circle { radius: 5.0 };
    //输出: Circle with radius 5.00  
    println!("{}", circle);
}

2.实现 Debug trait

fn main() {
    use std::fmt;

    struct Rectangle {
    width: u32,
    height: u32,
    }

    impl fmt::Debug for Rectangle {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
            write!(f, "Rectangle {{ width: {}, height: {} }}", self.width, self.height)
        }
    }

    let rect = Rectangle { width: 10, height: 5 };
    //输出: Rectangle { width: 10, height: 5 }
    println!("{:?}", rect); 
}

总结

Rust的格式化输出功能非常强大,支持多种数据类型的自定义输出格式。

常见的输出宏包括println!和format!,它们结合不同的格式化占位符和数据类型可以满足大多数输出需求。

使用 {} 进行简单的输出。

使用 {:?} 或 {:#?} 输出调试信javascript息。

格式化选项如 {:width}, {:.precision}, {:+}, {:x} 等提供了灵活的输出控制。

通过实现 Display 或 Debug trait,你可以为自定义类型提供格式化输出。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Rust格式化输出方式总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153552

相关文章

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4