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方法得到一个可用的拥有所用权的链接对象进行查询。

阅读全文

用最简单的方式实现 Rust RPC 服务

RPC是对进程内函数调用的分布式开展,它将进程内的函数调用,扩展成对远程机器上的相应的函数的调用。如何使用最少的代码,用最容易的方式调用远程函数呢?

首先需要知道远程机器的IP地址和端口,然后呢,使用原先进程内的方式直接调用即可,这是最容易的RPC调用。容易不意味着功能简单,而是rpc库背后默默为你承担了序列化、网络传输、路由、服务调用、服务治理的功能。

rpcx秉承 Go 标准库简单而强大的设计理念,为 Rust 提供了一个原生的 rpc 库。

为什么说是原生呢?因为你可以使用任何你熟悉的编程语言通过HTTP或者JSON-RPC2.0的方式访问Go或者Java实现的rpcx服务,但是除了Go/Java编程语言你没有办法使用raw的rpcx protocol实现TCP的网络调用,而基于TCP的RPC性能要远远高于Request-Response这种类HTTP的调用模型。

现在rpcx for rust的库也发布了: rpcx-rs。 你可以使用它原生的访问Go或者Java实现的rpcx服务,也可以使用Rust提供rpcx服务。

关键是,依然是那么的简单。

阅读全文

理解Rust的生命周期

原文: Understanding Lifetimes in Rust by Daniel P. Clark.

高级语言很方便地处理我们代码中的每个对象的存活的范围(scope), 我们不需要理解这些对象的生命周期。Rust同样为我们管理着生命周期,我们可以通过所有权(ownership)和借用(borrowing)对简单情况进行更多的控制,但是对于复杂的情况,我们需要在代码中给出识别标识,以便编译器能够理解更大的生命周期的范围。

简单的说,一切的一切归根结底都是为了在对象使用完之后就释放它。高级语言如Go、Ruby、Python等等,使用垃圾回收器在整个代码中扫描和标记对象,以查看它们是否准备好从内存中释放掉,并将对所有已标记可释放的对象执行释放操作。当你不再使用对象时,低级语言如C、汇编要求你手工释放它们。

Rust避免了垃圾回收和手写代码释放内存的成本,它根据代码库中每个对象的生命周期维护释放内存的时间。生存期主要由所有权系统决定(描述代码的哪个部分负责拥有内存中对象的系统),以及在复杂情况下,由帮助编译器而提供的手动生命周期描述符来决定。一旦对象的生命周期束,内存将立即释放。

阅读全文