1

今天打算练练手,试着用 Rust 写一点东西(实现 23/ZMTP,嘘……)。昨天晚上又读了一遍最新的 Tutorial,今天早晨开始从验证一些疑问开始。笔记包含的内容可能比较繁杂没有主线,仅供参考。

项目叫做 zmq.rs,意为 Rust 实现的 ZeroMQ,地址是:https://github.com/fantix/zmq.rs。项目动机:rust-zmq 不支持 libgreen,再加上最近 zeromq-dev 列表里有人刚好提到也想做。

Rust 在 ArchLinux 下的每日构建

因为 Rust 语言更新太快,必须得用最新的 0.10-pre 才能跟得上趟——编辑 /etc/pacman.conf,添加这一段:

[thestinger]
SigLevel = Optional TrustAll
Server = http://pkgbuild.com/~thestinger/repo/$arch

然后执行 yaourt -Sy rust-git 来安装就好了。

更新:thestinger 已经不再更新这个库了,最新版本也不再是 0.10-pre 了。Arch 用户可以使用 AUR 里相关的包。

参数传递

如果不用 box 或者引用,默认传参数都是值传递:

ruststruct MyType {
    value: int,
}

fn my_func(mut obj: MyType) {
    obj.value += 1;
}

fn main() {
    let orig = MyType {value: 1};
    my_func(orig);
    println!("Value is: {}", orig.value);
}

也就是说,跟 C 语言一样,my_func 拿到的 obj 对象只是 orig 对象的一个内存拷贝,修改 obj 的值并不能影响 orig 的值。

运行时

Rust 的运行时可以被看做是一种可选的、透明的语言内置库,被用来提供一些非核心的“高级”功能——比如垃圾回收、任务管理等。比如说,当代码里使用了 Task 相关的功能后,编译器会自动链接运行时库,并且在运行的时候在后台默默地启动运行时环境程序,而这些对于程序员是透明的——您不会留意到运行时的存在。

Rust 内置了两种不同的运行时环境,一种是 1:1 的标准线程模型 libnative(1 个 Task 独占一个系统线程),一种是 M:N 的微线程模型 libgreen(M 个 Task 共享 N 个系统线程)。以当前默认的 libgreen 为例吧,其实运行时就可以理解为 libuv 的 event loop,外加一些 Rust 自己的垃圾回收器等等。选择运行时需要在 fn main 之前做,类似这样的:

rustextern crate green;

#[start]
fn start(argc: int, argv: **u8) -> int {
    green::start(argc, argv, main)
}

fn main() {}

除了选择运行时的时候可能会碰到 libgreen 或者 libnative,否则一般情况下就很难再碰到这两个单词了——在使用诸如 spawn 之类的接口时,系统会自动地调用已选运行时的相应实现,将这些复杂性隐藏在了统一的接口背后。


fantix
1.7k 声望174 粉丝

Linux、Python 与开源爱好者一枚,GINO 项目作者,EdgeDB 团队成员。