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月前
|
分布式计算 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 若是设置参数该如何设置
|
6月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
5月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
42 3
|
5月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
170 4
|
5月前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
124 1
|
7月前
|
存储 Java
|
7月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
7月前
|
存储 Java
java实现双向链表的增删改查
这篇文章展示了如何在Java中实现双向链表的增加、删除、修改和查询操作,并通过代码示例演示了在双向链表中存储和操作学生信息的过程。
|
4月前
|
Rust 安全 Java
探索Rust语言的并发编程模型
探索Rust语言的并发编程模型
|
4月前
|
Rust 安全 区块链
探索Rust语言:系统编程的新选择
【10月更文挑战第27天】Rust语言以其安全性、性能和并发性在系统编程领域受到广泛关注。本文介绍了Rust的核心特性,如内存安全、高性能和强大的并发模型,以及开发技巧和实用工具,展示了Rust如何改变系统编程的面貌,并展望了其在WebAssembly、区块链和嵌入式系统等领域的未来应用。