type
status
date
slug
summary
tags
category
icon
password
box1.rs——智能指针
threads1.rs
- 线程返回值是如何得到的?
在
handle.join().unwrap()
中,join()
方法会等待线程执行完成并获取线程的返回值,即每个线程的执行时间(以毫秒为单位),然后通过 unwrap()
方法将其取出并存储在 results
向量中。- 线程编号和时间是如何输出的?
results.into_iter().enumerate()
: into_iter()
方法将 results
向量转换为一个拥有所有权的迭代器,enumerate()
方法对迭代器进行索引迭代,返回一个元组 (index, value)
,其中 index
表示元素在迭代器中的索引,value
表示元素的值。threads3.rs——多个发送者
为什么这里需要克隆发送方?
- 因为thread使用了闭包关键字move,这会使得在创建第一个线程时,tx的所有权已经被移到了第一个线程里面,第二个线程还想用tx发送信息自然是做不到的
- 因此克隆一个tx,第二个线程就可以使用了
macros3.rs
- 使用macro_rules!来定义宏
- 宏的定义必须在调用之前
- 通过在
my_macro
宏定义前加上#[macro_export]
属性,使得宏可以在模块外部使用
macros4.rs
模式匹配:
$()
中包含的是模式$x:expr
,该模式中的expr
表示会匹配任何 Rust 表达式,并给予该模式一个名称$x
- 因此
$x
模式可以跟整数1
进行匹配,也可以跟字符串 "hello" 进行匹配:vec!["hello", "world"]
$()
之后的逗号,意味着1
和2
之间可以使用逗号进行分割,也意味着3
既可以没有逗号,也可以有逗号:vec![1, 2, 3,]
*
说明之前的模式可以出现零次也可以任意次,这里出现了三次
匹配一次:
匹配多次:
tests5.rs——裸指针和unsafe
- 在裸指针
*const T
中,这里的*
只是类型名称的一部分,并没有解引用的含义
- 下面的代码基于值的引用同时创建了可变和不可变的裸指针,创建裸指针是安全的行为,而解引用裸指针才是不安全的行为 :
algorithm1——合并链表
algorithm2——链表反转
- 因为用到了clone,因此必须限定T是具有Clone特征的泛型
- 方法一
- 使用
std::mem::replace(self, reversed_list);
交换新链表和self的所有权
- 方法二
- 直接将新链表的所有权交给self
- 其中while循环那段可以这样改:
algorithm4——二叉查找树
- 因为要递归实现插入和查找,所以应该将search和insert实现为TreeNode的方法,所以TreeNode方法的实现应该要写在最前面
- 二叉树节点的方法:
- Author:orangec
- URL:orange’s blog | welcome to my blog (clovy.top)/4f40a64607384419bece8a34963191e6
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!