Rust 编程小技巧摘选(6)

简介: Rust 编程小技巧摘选(6)

Rust 编程小技巧(6)

1. 打印字符串

fn main() {
    println!("Hello, world");
    let s = "Rust";
    print!("{}", s);
    println!();
}

Rust 打印主要用宏 print!()、println!(),打印宏的占位符使用 {}。

2. 重复打印字串

有多种方法,比如使用:循环、string.repeat()、vector.join()等等。

fn main() {
    for _ in 0..8 {
        print!("rust");
    }
    println!("\n{}", "rust".repeat(8));
    let s = vec!["rust"; 8];
    println!("{:?}", s);
    println!("{}", s.join(""));
    println!("{}", s.join("."));
}

输出:

rustrustrustrustrustrustrustrust

rustrustrustrustrustrustrustrust

["rust", "rust", "rust", "rust", "rust", "rust", "rust", "rust"]

rustrustrustrustrustrustrustrust

rust.rust.rust.rust.rust.rust.rust.rust

3. 自定义函数

比如,一个整数的平方、绝对值

fn square(x: i32) -> i32 {
    x * x
}
fn abs(x: i32) -> i32 {
    if x < 0 {
        return -x;
    }
    x
}
fn main() {
    let n = square(9);
    println!("{}", n);
    println!("{}", abs(-10));
}

rust 函数的返回关键字 return,在最后的出口可以省略,只需一个表达式(不用分号结尾)。

4. 遍历动态数组

.into_iter() 转迭代器

fn main() {
    let items = vec![11, 22, 33];
    for x in items.clone().into_iter() {
        do_something(x);
    }
    items.clone().into_iter().for_each(|x| do_something(x));
    println!("{:?}", items);
}
fn do_something(n: i64) {
    println!("Number {}", n)
}

输出:

Number 11

Number 22

Number 33

Number 11

Number 22

Number 33

[11, 22, 33]

5. 遍历二维数组

.iter() 创建迭代器

fn main() {
    let vec = vec![vec![1, 2], vec![3, 4], vec![5, 6]];  
    for outer_iter in vec.iter() {  
        for inner_iter in outer_iter.iter() {  
            print!("{} ", inner_iter);  
        }  
    }
    println!();
    vec.iter().for_each(|x| x.iter().for_each(|y| print!("{} ", y)));
    println!();
}

6. 同时遍历索引和值

.enumerate() 枚举

fn main() {
    test1();
    test2();
}
fn test1() {
    let items = ["a", "b", "c"];
    for (i, x) in items.iter().enumerate() {
        println!("Item {} = {}", i, x);
    }
}
fn test2() {
    let items = ["a", "b", "c"];
    items.iter().enumerate().for_each(|(i, x)| {
        println!("Item {} = {}", i, x);
    });
}

7. 检查数组是否包含某个值

代码1:for ... in 遍历

fn contain(list: &[i32], num: i32) {
    let mut flag = false;
    for &i in list {
        if i == num {
            flag = true;
            break;
        }
    }
    if flag {
        println!("{:?} 包含 {}", list, num);
    } else {
        println!("{:?} 不含 {}", list, num);
    }
}
fn main() {
    let list = [1, 2, 3];
    let num = 0;
    contain(&list, num);
    let num = 2;
    contain(&list, num);
}

代码2: 迭代器 + any()方法

fn contain(list: &[i32], num: i32) {
    let flag = list.iter().any(|&item| item == num);
    if flag {
        println!("{:?} 包含 {}", list, num);
    } else {
        println!("{:?} 不含 {}", list, num);
    }
}
fn main() {
    let list = [1, 2, 3];
    let num = 0;
    contain(&list, num);
    let num = 2;
    contain(&list, num);
}

代码3: 直接用包含方法 contains()

fn contain(list: &[i32], num: i32) {  
    if list.contains(&num) {  
        println!("{:?} 包含 {}", list, num);  
    } else {  
        println!("{:?} 不含 {}", list, num);  
    }  
}  
fn main() {  
    let list = [1, 2, 3];  
    let num = 0;  
    contain(&list, num);  
    let num = 2;  
    contain(&list, num);  
}

输出:

[1, 2, 3] 不含 0

[1, 2, 3] 包含 2

8. 二维矩阵中查找某个值

fn search<T: Eq>(m: &Vec<Vec<T>>, x: &T) -> Option<(usize, usize)> {
    for (i, row) in m.iter().enumerate() {
        for (j, col) in row.iter().enumerate() {
            if *col == *x {
                return Some((i, j));
            }
        }
    }
    None
}
fn main() {
    let v = vec![
        vec![1, 2, 3],
        vec![4, 5, 6],
        vec![7, 8, 9],
    ];
    println!("{:?}", search(&v, &6));
    println!("{:?}", search(&v, &0));
}

输出:

Some((1, 2))

None  

附:迭代器方法的区别

.into_iter() 和 .iter() 两个方法都用于创建迭代器,它们的区别在于:

1.所有权转移:.into_iter() 方法会消耗当前的集合,并将所有权转移给迭代器。这意味着在迭代完成后,原集合将不再可用。而 .iter() 方法不会消耗集合,它只是创建一个新的迭代器,你可以在迭代完成后继续使用原集合。

2.消耗和产生元素:.into_iter() 会消耗集合中的元素,并将它们放入迭代器中。这意味着每次调用迭代器的 next() 方法都会消耗集合中的一个元素。而 .iter() 只是产生元素的引用,并不会消耗集合中的元素。

3.用途:当你需要遍历集合中的元素并获取它们的所有权时,应该使用 .into_iter()。当你只需要读取集合中的元素而不消耗它们时,应该使用 .iter()。

目录
相关文章
|
4月前
|
Rust 安全 区块链
探索Rust语言:系统编程的新选择
【10月更文挑战第27天】Rust语言以其安全性、性能和并发性在系统编程领域受到广泛关注。本文介绍了Rust的核心特性,如内存安全、高性能和强大的并发模型,以及开发技巧和实用工具,展示了Rust如何改变系统编程的面貌,并展望了其在WebAssembly、区块链和嵌入式系统等领域的未来应用。
|
4月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
5月前
|
Rust 算法 安全
如何学习Rust编程?
【10月更文挑战第12天】如何学习Rust编程?
103 1
|
5月前
|
Rust 安全 Java
探索Rust在系统级编程中的应用
【10月更文挑战第9天】Rust语言以其现代化设计、安全性和高性能,在系统级编程领域逐渐崭露头角。本文探讨Rust在操作系统开发、设备驱动、嵌入式系统和网络编程中的应用,介绍其核心优势及实施步骤,帮助读者了解如何在项目中有效利用Rust。
|
5月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
168 4
|
5月前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
119 1
|
5月前
|
Rust 安全 Java
探索Rust在系统编程中的崛起
Rust 是一种由 Mozilla 研究院开发的现代系统编程语言,以其在安全性、并发性和内存管理方面的优势,逐渐成为开发者的新宠。Rust 提供内存安全保证且性能媲美 C/C++,支持跨平台开发,并具备强大的并发编程工具。本文将介绍 Rust 的核心优势、工作原理及实施方法,探讨其在系统编程中的崛起及其面临的挑战。尽管 Rust 学习曲线较陡,但其广泛的应用场景和不断壮大的社区使其成为构建高性能、安全应用的理想选择。
|
6月前
|
Rust 网络协议 安全
Rust在系统编程中的案例分享
Rust在系统编程中的案例分享
102 10
10_填充每个节点的下一个右侧节点指针
10_填充每个节点的下一个右侧节点指针
|
6月前
|
Rust 安全 前端开发
30天拿下Rust之图形编程
30天拿下Rust之图形编程
114 0

热门文章

最新文章