Rust半小时教程

原文: A half-hour to learn Rust

为了熟练的掌握一门编程语言,人们不得不阅读它的大量的相关资料。但是如果你不理解这些资料介绍的内容,如何能学习更多的资料呢?
在本文中,我将尽可能多地列举Rust代码片段,并解释它们包含的关键字和符号的含义,而不是只关注Rust的一两个概念。

准备好了吗,让我们出发吧!

阅读全文

[译]构建你自己的block_on

原文: Build your own block_on()

如果你想搞清楚 future crate中的block_on是如何工作的,那么今天就让我们写一个自己的block_on函数。

这篇博文的灵感来自两个crate: wakefulextremewakeful设计了一种从函数中创建Waker的简单方法,而extreme则是block_on()的及其简洁的实现。

我们的实现目标将与extreme略有不同。与其追求零依赖和最少的代码行数,不如追求一个安全高效但仍然非常简单的实现。

我们将使用的依赖项是pin-utils, crossbeam, 和 async-task

阅读全文

[译]异步代码中的阻塞操作

Stjepan Glavina是Rust流行的库Crossbeam的作者,最近一年专注于async-std的开发。他最近写了两篇关于rust异步编程的文章,我翻译成中文,学习一下。

本篇原文是:Blocking inside async code

以下是翻译:

大家好,很久没写博文了,这次回来感觉真好。首先带来一个好消息。在Crossbeam上花了两年的时间后,2019年我把我的焦点放在了运行时异步编程研究上(比如async-stdtokio)。尤其是我想让异步运行时(async runtimes)更有效、更健壮,同时也更简单。

在这篇文章中,我想谈谈所有的运行时都面临的一个有趣的问题:从异步代码中调用阻塞函数。

阅读全文

Rust每周一库: matches!

每周一个 rust 库的时间到了,今天要介绍的是matches库。

最近Patrick Walton分析了crates.io上的500个rust库,对这些库按照某个维度计算了分数进行排名,其中一个分数就是根据它的流行度和它的大小计算一个分数进行排名,用来挑选小而美的rust库,这些库可以移植到标准库中,或者可以汇总到一个大库中。这个指数叫做left-pad index, 这个排名文件可以在这里找到。

left-pad是2016年nodejs圈发生的一个非常著名的事件。left-pad是一个只有17行的npm代码库,却被很多的代码库所使用,包括 babel 这样的热门项目。作者 Azer 将其从npm删除后,所有直接或者间接依赖这个模块的 NPM 包就悲剧的挂掉了,影响广泛。 原因在于作者写了一个叫 kik 的工具和某个公司同名了,这天公司的律师要求其删掉这个模块,把 kik 这个名字“让”给他们,作者不答应,律师就直接找 NPM 了,而 NPM 未经作者同意就把包的权限转移给了这家公司。于是,Azer 一怒冲冠,将他所有的 NPM 包全部删掉了。

所以Patrick Walton分析了crates.io库,对于那些代码量很小但是全被广泛应用的库提出了讨论,这些库是不是应该移动到标准库中?

其中,排名第一的就是matches库。

阅读全文

Rust每周一库: structopt

标准库提供了std::env::args()用来获取命令行的参数,第一个值是程序的名称,这和其它语言中的获取参数的方式类似:

1
2
3
4
5
6
7
let args: Vec<String> = env::args().collect();
let query = &args[1];
let filename = &args[2];
println!("Searching for {}", query);
println!("In file {}", filename);

但是在产品开发的过程中,我们需要比较多的程序参数,并且需要一定的规则和校验,这个时候我们就需要使用其它的一些库对这些参数进行解析,比如structopt库。

阅读全文

Rust每周一库: log

这周了解一下 rust 的日志系统。

日志库是产品级软件开发中经常使用的组件,用来记录系统运行的日志,经常我们会把日志按照重要性分成几个级别,有时候会输出到终端中,有时候会输出到日志文件,或者输出到某个集中的日志处理系统中。

Java中曾经广泛使用的是apache log4j日志库,后来slf4j逐渐流行并广泛使用,slf4j是一个日志门面,具体的日志还是可以通过log4j或者logback等日志框架来实现。 通过定义统一的日志门面,可以让开发者不必拘泥于日志框架的选择,使用统一的日志记录方式,可以自多个日志框架中灵活切换。

rust也有类似的“日志门面”库, 也就是log库。

阅读全文

Rust每周一库: lazy_static

八月中秋白露,路上行人凄凉。小桥明月桂花香,日夜千思万想。 心中万般宁静,青春好读文章。 十年苦读在书房,方见才学益广。

辛弃疾《西江月·夜行黄沙道中》

lazy_static 是rust中广泛使用的一个库,一直处于“Most Downloaded”下载列表的前十中,每天的下载量也是上万次。

它使用简单,切换方便,功能专一,同时支持stdno-std,也是一个我们学习rust开发的很好的例子。

lazy_static可以帮助你实现延迟初始化static常量的功能。

阅读全文

Rust每周一库: LRU

今天我们来学习lru库。

LRU置换算法是一种很常用的缓存淘汰算法,称作最近最少使用(Least Recently Used)算法。缓存的大小是有限的,一旦放入对象的时候超过了缓存的容量,需要根据一个算法剔除一些对象,LRU就是一种剔除算法,它是把最近很少使用的对象剔除出去,也就是剔除最久没有访问的对象。

阅读全文

[译]Rust返回引用的不同策略

原文: Strategies for Returning References in Rust by Bryce Fisher-Fleig.

译者按: 这是 Fisher-Fleig 整理一篇关于从函数/方法中返回引用值的知识。
很显然,对于Rust初学者来说,很容易陷入无法返回函数内的本地变量的泥沼里,尤其是从其它编程语言如Java、Go转过来的程序员,在其它编程语言中很容易的编程方式却在Rust编程语言中行不通。这篇文章可以帮助你理解返回引用的各种方法,包括网友也提供的一些方法。

这次我会演示我在编程中经常和Borrow Checker有冲突的一些场景,提供一些修改代码以便成功编译的编程模式。

假定我们使用一个数据库连接池去连接一个假想的Postgres数据库。这个假想的库的API需要我们首先使用一个字符串初始化一个连接池。一旦连接池初始化成功,我们就可以调用它的connect方法得到一个可用的拥有所用权的链接对象进行查询。

阅读全文