通告
周日的新闻会合并到「本周精选」中
【油管】Rust和Node.js语言设计: 关于Async编程的两个故事
前奏: 为了解决C10K问题
- 线程 ,太昂贵
- Reactor模式, Node.js使用的事件驱动库libuv就是Reactor模式,核心是提供了一个event-loop
Node.js语言设计 :
- 纯事件驱动
- 事件编程是其主要范式
- 为脚本语言构建并发编程无阻塞基础设施,基于libuv
- 单线程
Rust语言设计:
- 系统级编程语言,可直接和操作系统打交道
- Futures + mio = tokio
- Tokio实现了Reactor模式
ion:来自Redox的强大Shell
完全使用Rust实现,功能简单但强大,而且安全。性能超过dash,虽然和Redox一起发布,但是也可以用于其他*nix平台
Rust Logo 风格设计图
不可思议的Rust原生类型
fn main(){
println!(“{}”,8.to_string() )
}
这段代码是否可以运行?请按你的直觉说出答案。
熟悉Rust的人,都知道,这个可以运行,因为其实是数字类型实现了ToString trait。
impl<T: fmt::Display + ?Sized> ToString for T
但是作者对此表示惊奇,还对比了Java、Python、C的处理原生类型的方式
他生成了相关调用的汇编代码:
; Cool stuff right here
call <T as alloc::string::ToString>::to_string@PLT
这篇文章让我看到了一个学习Rust的反例: 以传统编程语言的思维去学习Rust。
我真想建议他,要不然先看看trait ? 事实上已经有朋友在评论里告诉他了。
Programming Servo系列博文: 通用的worker事件循环
本文介绍了Servo中使用的通用worker事件循环组件 WorkerEventLoopMethods
学习Rust的泛型
「油管 Hello Rust系列」Go vs Rust: 并发与竞态条件
Niko博文 Rust模式系列:为Rc<Vec<T>>
构建迭代器
问题: 给定Rc <Vec <u32 >>
的所有权,我们可以编写一个返回impl Iterator <Item = u32>
的函数吗?
fn iterate(data: Rc<Vec<u32>>) -> impl Iterator<Item = u32> {
... // what we want to write!
}
以下方案是错的:
fn iterate(data: Rc<Vec<u32>>) -> impl Iterator<Item = u32> {
data.iter().cloned() // `data` would be dropped while still borrowed
}
等价于:
fn iterate(data: Rc<Vec<u32>>) -> impl Iterator<Item = u32> {
let iterator = Iterator::new(&data); // <-- call to iter() returns this
let cloned_iterator = ClonedIterator::new(iterator); <-- call to cloned()
cloned_iterator
}
Rc<Vec<u32>>
的问题在于,只拥有Vec<u32>
的所有权,只能获得&Vec<u32>
的引用,并且其生命周期只永远不会超过Rc<Vec<u32>>
,所以导致,永远无法在数据上返回迭代器。
要编写这个函数,我们需要找到一些方法将数据的所有权返回给调用者,同时仍然产生一个迭代器。
fn iterate(data: Rc<Vec<u32>>) -> impl Iterator<Item = u32> {
let len = data.len();
(0..len).map(move |i| data[i])
}
这里正好因为当前Rc里的长度是固定的,可以使用这个技巧应用于其他类型。
fn iterate(data: Rc<Vec<String>>) -> impl Iterator<Item = String> {
let len = data.len();
(0..len).map(move |i| data[i].clone())
}
但要注意使用clone,还是所有权的问题。
未来如何扩展语言来解决这些问题?
- 支持自引用。自引用可以解决类似的问题,延长生命周期的使用。等NLL工作结束以后,就会考虑自引用如何在Rust中建模的问题了。
- 辅助值。 基于辅助值可以实现这样的函数签名
fn iterate<T>(data: Rc<Vec<T>>) -> impl Iterator<Item = &'aux T>
, 生命周期参数可以借助辅助值aux来给予。
使用gfx-rs实现的Veloren像素游戏世界
The voxel world of Veloren, written in Rust and rendered using gfx-rs
评论区
写评论还没有评论