今天打算练练手,试着用 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 或者引用,默认传参数都是值传递:
rust
struct 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
之前做,类似这样的:
rust
extern crate green; #[start] fn start(argc: int, argv: **u8) -> int { green::start(argc, argv, main) } fn main() {}
除了选择运行时的时候可能会碰到 libgreen
或者 libnative
,否则一般情况下就很难再碰到这两个单词了——在使用诸如 spawn
之类的接口时,系统会自动地调用已选运行时的相应实现,将这些复杂性隐藏在了统一的接口背后。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。