张汉东的 Rust 实战课
张汉东
《Rust 编程之道》作者
11983 人已学习
新⼈⾸单¥68
课程目录
已完结/共 174 讲
第一章:Rust语言基础 (32讲)
时长 11:04
时长 04:20
第二章:Rust语言核心概念 (56讲)
第三章:Rust异步编程基础 (52讲)
第四章:构建自己的异步Web框架 (34讲)
张汉东的 Rust 实战课
登录|注册
留言
7
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 13 | 语法面面观:函数与闭包(三)
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
学习方法推荐与课程组织逻辑
03 | Rust语言学习观
04 | Rust语言概览
05 | 语法面面观:词法结构
06 | 语法面面观:面向表达式(一)
07 | 语法面面观:面向表达式(二)
08 | 语法面面观:面向表达式(三)
09 | 语法面面观:数据类型 (一)
10 | 语法面面观:数据类型 (二)
11 | 语法面面观:函数与闭包(一)
12 | 语法面面观:函数与闭包(二)
13 | 语法面面观:函数与闭包(三)
14 | 语法面面观:模式匹配
15 | 语法面面观:智能指针(一)
16 | 语法面面观:智能指针(二)
17 | 语法面面观:字符与字符串(一)
18 | 语法面面观:字符与字符串(二)
19 | 语法面面观:集合容器(一)
20 | 语法面面观:集合容器(二)
21 | 语法面面观:迭代器(一)
22 | 语法面面观:迭代器(二)
23 | Rust语法面面观:模块
24 | 语法面面观:Cargo包管理器(一)
25 | 语法面面观:Cargo包管理器(二)
26 | 语法面面观:实际项目的组织结构(一)
27 | 语法面面观:实际项目的组织结构(二)
28 | 语法面面观:定义自己的Crate(一)
29 | 语法面面观:定义自己的Crate(二)
30 | 语法面面观:定义自己的Crate(三)
31 | 作业&第二章预告
32 | 本章内容介绍:Rust语言架构
33 | 所有权:内存管理基础知识
34 | 所有权:安全管理之内存安全
35 | 所有权:Copy语义和Copy trait
36 | 所有权:深入理解Copy行为
37 | 所有权:深入理解Move语义
38 | 所有权:Move与析构
39 | 借用检查: 完全理解Scope和NLL
40 | 借用检查: 深入理解生命周期和生命周期参数
41 | 借用检查: 深入理解生命周期参数Early bound
42 | 借用检查:深入理解生命周期参数Tvs&T
43 | 借用检查: 深入理解生命周期参数: trait对象的生命周期参数
44 | 借用检查: 深入理解生命周期参数:高阶生命周期(一)
45 | 借用检查: 深入理解生命周期参数:高阶生命周期(二)
46 | 借用检查: 深入理解生命周期参数:高阶生命周期(三)
47 | 线程与并发:理解线程与并发
48 | 线程与并发:线程间安全共享数据
49 | 线程与并发:构建「无悔」并发系统(一)
50 | 线程与并发:构建「无悔」并发系统(二)
51 | 线程与并发:构建「无悔」并发系统(三)
52 | 线程与并发:构建「无悔」并发系统(四)
53 | 线程与并发:无锁并发(一)
54 | 线程与并发:无锁并发(二)
55 | 线程与并发:无锁并发(三)
56 | trait与泛型:trait静态分发
57 | trait与泛型:认识trait对象
58 | trait与泛型:泛型和trait实现模板方法
59 | trait与泛型:trait对象本质
60 | trait与泛型:对象安全本质
61 | trait与泛型:利用Enum代替trait对象
62 | trait与泛型:trait覆盖实现的一个解决方案
63 | trait与泛型:trait对象与Sized
64 | trait与泛型:trait对象与Box Self
65 | 编程范式:Rust语言编程范式讨论(一)
66 | 编程范式:Rust语言编程范式讨论(二)
67 | Rust错误处理概要
68 | Rust错误处理:Option
69 | Rust错误处理:Result(一)
70 | Rust错误处理:Result(二)
71 | Rust错误处理:try
72 | Rust错误处理:Panic
73 | Rust元编程之反射
74 | Rust元编程之反射的两种应用思路
75 | Rust元编程之编译过程与宏展开概述
76 | Rust元编程之声明宏(一)
77 | Rust元编程之声明宏(二)
78 | Rust元编程之过程宏:三件套介绍
79 | Rust元编程之过程宏:Bang宏实现原理
80 | Rust元编程之过程宏:使用配置文件动态生成代码
81 | Rust元编程之过程宏:Derive宏案例
82 | Rust元编程之过程宏:属性宏
83 | 客观理解Unsafe Rust
84 | Unsafe Rust安全抽象
85 | Unsafe Rust安全抽象:Drop检查
86 | Unsafe Rust安全抽象:型变
87 | UnsafeRust的其他知识点
88 | Rust异步编程之IO模型
89 | Rust异步编程之epoll和io_uring
90 | Rust异步编程之事件驱动编程模型
91 | Rust异步编程之epoll代码实践
92 | Rust异步编程之Reactor代码实践
93 | Rust异步编程之MiniMio代码实践
94 | Rust异步编程之Mio代码实践(一)
95 | Rust异步编程之Mio代码实践(二)
96 | Rust异步编程之异步编程模型概要
97 | Rust异步编程之Future和Futures-rs介绍
98 | Rust异步编程之编写异步echo服务(一)
99 | Rust异步编程之编写异步echo服务(二)
100 | Rust异步编程之编写异步echo服务(三)
101 | Rust异步编程之深入理解异步Task模型
102 | Rust异步编程之Waker实现
103 | Rust异步编程之Futures库源码导读(一)
104 | Rust异步编程之Futures库源码导读(二)
105 | Rust异步编程之Futures库源码导读(三)
106 | Rust异步编程之Futures库源码导读(四)
107 | Rust异步编程之async-await语法背后
108 | Rust异步编程之生成器(一)
109 | Rust异步编程之生成器(二)
110 | Rust异步编程之Pin与Unpin(一)
111 | Rust异步编程之Pin与Unpin(二)
112 | Rust异步编程之Pin与Unpin(三)
113 | Rust异步编程之Pin与Unpin(四)
114 | Rust异步编程之no-std异步生态介绍
115 | Rust异步编程之实现异步缓存(一)
116 | Rust异步编程之实现异步缓存(二)
117 | Rust异步编程之异步运行时生态介绍
118 | Rust异步编程之smol运行时(一)
119 | Rust异步编程之smol运行时(二)
120 | Rust异步编程之smol运行时(三)
121 | Rust异步编程之smol运行时(四)
122 | Rust异步编程之smol运行时(五)
123 | Rust异步编程之smol运行时(六)
124 | Rust异步编程之smol运行时(七)
125 | Rust异步编程之smol运行时(八)
126 | Rust异步编程之smol运行时(九)
127 | Rust异步编程之smol运行时(十)
128 | Rust异步编程之async-std运行时(一)
129 | Rust异步编程之async-std运行时(二)
130 | Rust异步编程之tokio运行时(一)
131 | Rust异步编程之tokio运行时(二)
132 | Rust异步编程之tokio运行时(三)
133 | Rust异步编程之tokio运行时(四)
134 | Rust异步编程之tokio运行时(五)
135 | Rust异步编程之tokio运行时(六)
136 | Rust异步编程之tokio运行时(七)
137 | Rust异步编程之tokio运行时(八)
138 | Rust异步编程之tokio运行时(九)
139 | Rust异步编程之tokio运行时(十)
140 | Rust异步Web框架开篇
141 | Rust异步Web框架之Rocket(一)
142 | Rust异步Web框架之Rocket(二)
143 | Rust异步Web框架之Rocket(三)
144 | Rust异步Web框架之tide
145 | Rust异步Web框架之actix-web(一)
146 | Rust异步Web框架之actix-web(二)
147 | Rust异步Web框架之gotham-and-thruster
148 | Rust异步Web框架之tower(一)
149 | Rust异步Web框架之tower(二)
150 | Rust异步Web框架之hyper(一)
151 | Rust异步Web框架之hyper(二)
152 | Rust异步Web框架之hyper(三)
153 | Rust异步Web框架之warp
154 | Web框架实战之HTTP库介绍
155 | Web框架实战之了解hyper-tower_http-http-body之间的层次关系
156 | Web框架实战之创建初始项目
157 | Web框架实战之设计框架接口
158 | Web框架实战之实现路由结构
159 | Web框架实战之实现路由结构(二)
160 | Web框架实战之实现路由结构(三)
161 | Web 框架实战之实现路由结构(四)
162 | Web 框架实战之实现路由结构(五)
163 | Web 框架实战之实现 Handler(一)
164 | Web 框架实战之实现 Handler(二)
165 | Web 框架实战之实现 Handler(三)
166 | Web 框架实战之实现 Handler(四)
167 | Web 框架实战之添加 tracing 打印
168 | Web 框架实战之实现提取器(一)
169 | Web 框架实战之实现提取器(二)
170 | Web 框架实战之实现提取器(三)
171 | Web 框架实战之实现提取器和中间件(四)
172 | Web 框架实战之错误处理支持
173 | 课程完结回顾
本节摘要
登录 后留言

全部留言(7)

  • 最新
  • 精选
Dowen Liu
第二人示例,我觉得与逃逸闭包无关吧。这个例子反应的应该是 FnMut/FnOnce 语义问题。 把代码改成: fn c_mut2() -> impl for<'a> FnMut(&'a str) -> String { let mut s = "hello ".to_string(); move |i| { s += i; s.clone() } } 这样编译就能通过了。编译器报错是因为 s 作为没有实现 Copy 的变量,不能移出FnMut闭包,如果移出就违反的 FnMut 的要求。 把 impl FnMut 改成 impl FnOnce 也能通过编译。
2021-11-17
1
2
应该是唯一的可变应用(独占借用)
2021-02-23
2
Geek_2c578d
第二个示例应该是 move 将所有权移动到闭包后,不能将闭包内捕获的环境变量所有权又移送到外部,否则的话下一次调用 FnMut 时环境变量已经没有了(因为所有权之前移出了),闭包的生命周期长于成员(即环境变量)的生命周期,自然会报错。这也是为什么把FnMut换成FnOnce就能编译通过的原因,因为此时闭包的生命周期和成员(即环境变量)的环境变量相等了
2022-05-18
1
Geek_7c4953
为什么闭包只能是独占借用呢?如果闭包不独占会有什么安全问题?
2021-05-12
2
1
张晶鹏
为什么实例2里面 有没有move 一样的呢。正常应该是捕获引用, 如果不加move,即应该是 s 应该是&String类型的啊
2023-04-28
万正宇
--011 /** 1.函数项类型 Fn Item Type 2.函数指针类型 Fn Pointer Type 3.闭包类型 Closure */ /**01*/ struct T(u8, u8); impl T { fn sum(a:u8, b:u8) -> u8 {a+b} fn math(&self) -> u8 { Self::sum(self.0, self.1) } } fn main() { let t = T(1,2); let add = T::sum; let add_math = T::math; assert_eq!(add(1,2), T::sum(1,2)); assert_eq!(add_math(&t), t.math()); } /**02*/ #![allow(unused)] type RGB = (u8, u8, u8); //别名 fn color(c: &str) -> RGB { (255, 255, 255) } fn show(c: fn(&str) -> RGB) { println!("{:?}", color("white")); } fn main() { let white = color; // Fn Item Type let w: fn(&str) -> RGB = white; show(white); //// fn(&str) -> RGB , Fn Pointer Type show(w); //// 隐式转化 println!("{:?}", std::mem::size_of_val(&white)); // 0 ////零大小类型优化 println!("{:?}", std::mem::size_of_val(&w)); // 8 //// Fn, FnMut, FnOnce // let bibao = |s:&str| { (1, 1, 1) }; //定义闭包? show(bibao); } /**03*/ fn counter(i: i32) -> impl FnMut(i32) -> i32 { //i 环境变量,自由变量 move |n| n + i } fn main() { let mut f = counter(2); assert_eq!(3, f(1)); } --012 闭包 /** Ownership , &mut T , &T 所有权,可变借用,不可变借用 FnOnce<()> (to similar = fn(T) 函数指针) , FnMut<()> , Fn<()> call_once(()) , call_mut(()) , call(()) */ fn main() { let mut arr = [1, 2, 3]; let mut c = |i| { //// env_var for idx in 0..3 { arr[idx] = i; } println!("arr = {:?}", arr); }; c(6); } --013 /** 逃逸,非逃逸,实现了的Trait? */ fn c_mut() -> impl for<'a> FnOnce(&'a str) -> String { let mut s = "hello".to_string(); move |i| { s+= i; s } } fn foo<F: Fn() + Copy>(f: F) { f() } fn main() { let i = ", world"; let mut str_closure = c_mut(); let mut arr = [1,2,3]; let p = &mut arr; { let mut c = || { (*p)[0] = 0; }; c(); } let z = &p; //唯一不可变引用 }
2022-04-23
陆一鸣猜不动
没怎么消化,需要回来再看看
2022-02-07
收起评论