2 minutes
Rust_learn
入门学习:
- 学习写一个多线程的 echo server: https://hermanradtke.com/2015/07/22/creating-a-multi-echo-server-using-rust-and-mio.html
其他的框架学习:
- mio : https://fugangqiang.github.io/posts/rust/rust%E4%B9%8Bmio.html
- futures
- tokio
rust学习资料: rust每日新闻: https://github.com/RustStudy/rust_daily_news rust社区: https://rust.cc/ rust中文: https://rustlang-cn.org/ rust新闻: https://www.yuque.com/chaosbot/rustnews rust文档: https://doc.rust-lang.org/stable/book rust官方设计: https://github.com/rust-lang/rfcs
feature
https://wiki.jikexueyuan.com/project/rust-primer/intoborrow/borrow.html 内部等价性 怎么理解 ? ToOwned 不理解
Borrow 的前后类型之间要求必须有内部等价性。不具有这个等价性的两个类型之间,不能实现 Borrow。
AsRef 更通用,更普遍,覆盖类型更多,是 Borrow 的超集。
slab 是怎么使用的呢? token? 啥时候放进去的? 返回值 ?
这种情况会返回什么? let event = self.events.get(i).ok_or_else(|| { io::Error::new(ErrorKind::Other, “Failed to get event”) })?;
很多返回结果并没有处理
特殊的打印格式: {:?} 变量可以重新绑定; 可以多变量绑定 特殊的数据类型: isize usize; &str string; 元类型和指针类型 这个还是很全的: https://wiki.jikexueyuan.com/project/rust-primer/quickstart/primitive-type.html vec! 不多于32个元素的数组和不多于12个元素的元组在值传递时是自动复制的 只能使用as关键字显式转换 type 类型定义, go也支持 str = &‘static str; &str 本质上是 数组 &[u8];String 是 vec:Vec
hup event ? match self.connection(token).writable() { 竟然会error
conns: Slab,
看下这些实现 Drop提供了当一个值退出作用域后执行代码的功能,它只有一个drop(&mut self)方法。 Borrow用于创建一个数据结构时把拥有和借用的值看作等同。 AsRef用于在泛型中把一个值转换为引用。 Deref<Target=T>用于把&U类型的值自动转换为&T类型。 Iterator用于在集合 (collection) 和惰性值生成器 (lazy value generator) 上实现迭代器。 Sized用于标记运行时长度固定的类型,而不定长的切片和特性必须放在指针后面使其运行时长度已知, 比如&[T]和Box。
VecDeque
不太理解 let mut recv_buf : Vec = Vec::with_capacity(msg_len); unsafe { recv_buf.set_len(msg_len); }
抄写一遍
先 mio, 在 tokio
unwrap
move || ?
let graph = SimpleGraph; let object = Box::new(graph) as Box<Graph<N=Node, E=Edge»;
while let 是? https://wiki.jikexueyuan.com/project/rust-primer/quickstart/control-flow.html
泛型? impl Trait and generics work with any trait ? trait 和 Trait 差异很大
struct对于 引用的处理 https://wiki.jikexueyuan.com/project/rust-primer/type/compound-types.html 结构体里的引用字段必须要有显式的生命周期 你调用了一下别人,然后你就不属于你了
生命周期&所有权
问题
rust 的泛型 是怎么实现的 ?
对于多态函数,存在两种派分 (dispatch) 机制:静态派分和动态派分。 前者类似于C++的模板,Rust会生成适用于指定类型的特殊函数,然后在被调用的位置进行替换, 好处是允许函数被内联调用,运行比较快,但是会导致代码膨胀 (code bloat); 后者类似于Java或Go的interface,Rust通过引入特性对象 (trait object) 来实现, 在运行期查找虚表 (vtable) 来选择执行的方法。特性对象&Foo具有和特性Foo相同的名称, 通过转换 (casting) 或者强制多态化 (coercing) 一个指向具体类型的指针来创建
dyn trait 的差异
https://zhuanlan.zhihu.com/p/109990547
it also supports dynamic dispatch through a mechanism called ‘trait objects’.
Rust 编译器会通过单态化(Monomorphization) 将泛型函数展开
想起了any的实现, 本质上也是编译后代码生成 多种实现
Rust 的 trait object 使用了与 c++ 类似的 vtable 实现, trait object 含有1个指向实际类型的 data 指针, 和一个指向实际类型实现 trait 函数的 vtable, 以此实现动态分发. 更加详细的介绍
https://alschwalm.com/blog/static/2017/03/07/exploring-dynamic-dispatch-in-rust/
fn some_fn(param1: i32, param2: i32) -> &'static View {
用拥有所有权的 Box 智能指针避免烦人的生命周期说明
https://github.com/rust-lang/rfcs/blob/master/text/2113-dyn-trait-syntax.md 协议改造
https://doc.rust-lang.org/book/trait-objects.html#representation
245 Words
2019-04-11 16:01 +0800