type
status
date
slug
summary
tags
category
icon
password

box1.rs——智能指针

threads1.rs

  • 线程返回值是如何得到的?
    • 在 handle.join().unwrap() 中,join() 方法会等待线程执行完成并获取线程的返回值,即每个线程的执行时间(以毫秒为单位),然后通过 unwrap() 方法将其取出并存储在 results 向量中。
      notion image
  • 线程编号和时间是如何输出的?
    • 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

模式匹配:
  1. $() 中包含的是模式 $x:expr,该模式中的 expr 表示会匹配任何 Rust 表达式,并给予该模式一个名称 $x
  1. 因此 $x 模式可以跟整数 1 进行匹配,也可以跟字符串 "hello" 进行匹配: vec!["hello", "world"]
  1. $() 之后的逗号,意味着1 和 2 之间可以使用逗号进行分割,也意味着 3 既可以没有逗号,也可以有逗号:vec![1, 2, 3,]
  1. *说明之前的模式可以出现零次也可以任意次,这里出现了三次
匹配一次:
匹配多次:

tests5.rs——裸指针和unsafe

  • 在裸指针 *const T 中,这里的 * 只是类型名称的一部分,并没有解引用的含义
  • 下面的代码基于值的引用同时创建了可变和不可变的裸指针,创建裸指针是安全的行为,而解引用裸指针才是不安全的行为 :

    algorithm1——合并链表

    algorithm2——链表反转

    • 因为用到了clone,因此必须限定T是具有Clone特征的泛型
    • 方法一
      • 使用std::mem::replace(self, reversed_list); 交换新链表和self的所有权
    • 方法二
      • 直接将新链表的所有权交给self
    • 其中while循环那段可以这样改:

      algorithm4——二叉查找树

      • 因为要递归实现插入和查找,所以应该将search和insert实现为TreeNode的方法,所以TreeNode方法的实现应该要写在最前面
      • 二叉树节点的方法:
        • 二叉树的方法
          • algorithm7——用Vec实现栈

            algorithm8——两个队列实现栈

            algorithm9——堆排序

            algorithm10——图

            用到了get_mut()
        数组Computer Networking Notes
        • Giscus