目錄
Rust 編程小技巧(7)
1. 交換變量
2. 翻轉(zhuǎn)數(shù)組
3. for_each() 用法
4. 結構體 Display trait
5. HashMap 和 BTreeMap
6.?遍歷輸出哈希表
7. 分離奇數(shù)和偶數(shù)
8. 判斷素數(shù)(質(zhì)數(shù))
Rust 編程小技巧(7)
1. 交換變量
與python, go等語言用法類似,不同的是rust不能省掉元組的括號 () 。
fn main() {
let a = 3;
let b = 23;
println!("a: {}, b: {}", a, b);
let (a, b) = (b, a);
println!("a: {}, b: {}", a, b);
}
輸出:
a: 3, b: 23
a: 23, b: 3
2. 翻轉(zhuǎn)數(shù)組
fn main() {
let x = vec!["Hello", "World"];
let y: Vec<_> = x.iter().rev().collect();
println!("{:?}\n{:?}", x, y);
let mut z = vec![1,2,3];
println!("{:?}", z);
z.reverse();
println!("{:?}", z);
}
輸出:
["Hello", "World"]
["World", "Hello"]
[1, 2, 3]
[3, 2, 1]?
3. for_each() 用法
fn main() {
// 迭代一個 vec 并打印每個元素
let vec = vec![1, 2, 3, 4, 5];
vec.iter().for_each(|x| print!("{} ", x));
println!();
// 迭代一個字符串并打印每個字符
let s = "hello";
s.chars().for_each(|c| print!("{} ", c));
println!();
// 迭代一個 vec 并將其元素加倍
let mut v1 = vec![1, 2, 3, 4, 5];
let mut v2 = vec![];
v1.iter().for_each(|x| v2.push(x * 2));
println!("{:?}", v2);
v1.clone().iter().for_each(|x| v1.push(x * 2));
println!("{:?}", v1);
}
輸出:
1 2 3 4 5?
h e l l o?
[2, 4, 6, 8, 10]
[1, 2, 3, 4, 5, 2, 4, 6, 8, 10]
4. 結構體 Display trait
結構體的兩種形式,對應的成員取法不同;
前者用 self.成員變量名 self.x, self.y;后者用 self.成員索引號 self.0, self.1, self.2, ......
use std::fmt::Display;
use std::fmt::Result;
use std::fmt::Formatter;
struct Point {
x: f64,
y: f64,
}
struct Point2(f64, f64);
impl Display for Point {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(f, "({}, {})", self.x, self.y)
}
}
impl Display for Point2 {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(f, "({}, {})", self.0, self.1)
}
}
fn main() {
let p = Point { x: 2.0, y: -3.5 };
println!("{}", p);
let p = Point2(2.0, -3.5);
println!("{}", p);
}
?輸出:
(2, -3.5)
(2, -3.5)
5. HashMap 和 BTreeMap
兩者都是 Rust 中的哈希表數(shù)據(jù)結構,它們的相同點:
都支持使用 Vec 或 String 作為鍵,也支持使用標準庫中的其他結構體作為鍵。
都支持使用 Option 類型作為鍵值對中的值。
都支持使用 HashMap 類型的成員函數(shù)來進行基本的操作,例如插入、刪除、查找、更新等。
不同點:
HashMap 使用哈希表(HashMap)算法來存儲鍵值對,而 BTreeMap 使用 B-TREE(B 樹)算法來存儲鍵值對。因此,BTreeMap 在查找、插入、刪除等操作上的性能比 HashMap 更好。
如果需要使用哈希表(HashMap)數(shù)據(jù)結構,但不需要按照鍵值對的順序來訪問,而且對查找、插入、刪除等操作的性能要求不高,那么可以使用 HashMap。如果需要使用哈希表(HashMap)數(shù)據(jù)結構,而且對查找、插入、刪除等操作的性能要求較高,而且需要按照鍵值對的順序來訪問,那么可以使用 BTreeMap。
示例:
use std::collections::BTreeMap;
use std::collections::HashMap;
fn main() {
let mut x = BTreeMap::new();
x.insert("one", 1);
x.insert("two", 2);
println!("{:?}", x);
let x: HashMap<&str, i32> = [
("one", 1),
("two", 2),
].iter().cloned().collect();
println!("{:?}", x);
}
輸出:
{"one": 1, "two": 2}
{"one": 1, "two": 2}
6.?遍歷輸出哈希表
在for...in...循環(huán)結構中使用元組(k, v)讀取對應鍵值對:
use std::collections::BTreeMap;
use std::collections::HashMap;
fn main() {
let mut x = BTreeMap::new();
x.insert("one", 1);
x.insert("two", 2);
x.insert("three", 3);
x.insert("four", 4);
for (k, v) in &x {
println!("Key={}, Value={}", k, v);
}
println!();
let x: HashMap<&str, i32> = [
("one", 1),
("two", 2),
("three", 3),
("four", 4),
].iter().cloned().collect();
for (k, v) in &x {
println!("Key={key}, Value={val}", key = k, val = v);
}
}
輸出:
Key=four, Value=4
Key=one, Value=1
Key=three, Value=3
Key=two, Value=2
Key=three, Value=3
Key=two, Value=2
Key=one, Value=1
Key=four, Value=4
7. 分離奇數(shù)和偶數(shù)
.filter() 方法是一個在標準庫中的std::iter::Iterator trait的默認方法。這個方法會創(chuàng)建一個新的迭代器,包含所有滿足給定條件的元素。
示例:分離一個數(shù)組中的奇數(shù)和偶數(shù)
fn main() {
let mut vec = vec![1, 2, 3, 4, 5];
vec.clone().iter().for_each(|x| vec.push(x + 5));
println!("{:?}", vec);
fn is_even(x: &i32) -> bool { *x % 2 == 0 }
fn print_x(x: &i32) { print!("{} ", x) }
vec.iter().filter(|x| !is_even(x)).for_each(|x| print_x(x));
println!();
vec.iter().filter(|x| is_even(x)).for_each(|x| print_x(x));
println!();
}
輸出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1 3 5 7 9?
2 4 6 8 10??
8. 判斷素數(shù)(質(zhì)數(shù))
.any() 方法是一個在標準庫中的std::iter::Iterator trait的默認方法。這個方法會檢查迭代器中是否有元素滿足給定的條件,如果有元素滿足條件,它就會返回true,否則返回false。
示例:求30以內(nèi)的質(zhì)數(shù)
fn is_prime(n: u64) -> bool {
match n {
0..=1 => false,
_ => !(2..n).any(|d| n % d == 0),
}
}
fn main() {
for i in 1..=30 {
if is_prime(i) {
print!("{} ", i);
}
}
println!();
}
輸出:
2 3 5 7 11 13 17 19 23 29?
相關閱讀:
Rust 編程小技巧摘選(1)_Hann Yang的博客-CSDN博客
Rust 編程小技巧摘選(2)_Hann Yang的博客-CSDN博客
Rust 編程小技巧摘選(3)_Hann Yang的博客-CSDN博客
Rust 編程小技巧摘選(4)_Hann Yang的博客-CSDN博客
Rust 編程小技巧摘選(5)_Hann Yang的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-631959.html
Rust 編程小技巧摘選(6)_Hann Yang的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-631959.html
到了這里,關于Rust 編程小技巧摘選(7)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!