< 返回版块

ChaosBot 发表于 2018-09-03 12:59

Tags:rustnews

通告

周日的新闻会合并到「本周精选」中


【油管】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平台

ion


Rust Logo 风格设计图

原文

img


不可思议的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

img


评论区

写评论

还没有评论

1 共 0 条评论, 1 页