刚出来,仅供了解,这里的“交易”是指业务的原子性,常见于数据库中。与区块链或密码学中的交易,是不同的概念。类似于 STM。
Repo
一看就是国人的项目。命名有点玩耍的味道,但是思路和设计可以借鉴。
use duang::duang; duang!( pub fn foo<T>(a: T, b: f64 = 13.0, c: T = a * a) -> (T, f64, T) where T: std::ops::Mul<T, Output = T>, T: std::fmt::Display, T: Copy, { (a, b, c) } ); // ---- use demo_duang::foo; // pass assert_eq!(foo!(1, c = 30, b = -2.0), (1, -2.0, 30)); // pass assert_eq!(foo!(a = 10), (10, 13.0, 100)); // fail // foo!(1,c=30,c=2);
Repo
这个工具发布 v2.0 了。就是 du 的升级版。先看下效果图。
Repo
不过这个UI是用于游戏内的UI。
Repo
对于这些文件,就可以放心删除。这在重构的时候很有用。来看一下效果图:
Repo
作者说,在网上,总是听到说Rust这里好那里好,那么,Rust不好的地方有哪些?
这里就简单汇总一下人们的吐槽:
Compile times for large projects
Crate ecosystem is still very young, volatile and sparse
Because the community is young and still largely curiosity-driven, some essential crates have inconsistent maintenance since there aren't many maintainer organizations yet
Orphan rules make the glue-package approach (like Java uses) intractable and thus it's difficult to combine different parts of the ecosystem or factor libraries as much as one would like
Related to the above, we're probably still several years or editions away from a good dynamic linking/plugin story (but for good reason, related to the below)
The language's real potential still always seems one unimplemented RFC away (e.g., async, const generics, GATs, unsized rvalues, etc.)
A lot of the features really essential to write libraries of the quality one would like are still unstable (e.g., specialization)
Many crates have not yet reached version 1.0. This can make them more "scary" to use, as the API could change at any point.
std::net is quite lacking. For example, you can't perform a non-blocking connect. There is net2, but it has its own set of issues. Then there's socket2 to address net2's issues, but its API is a bit clunky. It's also not very popular, so it remains to be seen for how long it will stick around.
I think only recently was mirroring of crates.io introduced in a more sane way, though I don't remember exactly in what state.
Async IO is still clunky. MIO seeks to provide a nice API, but it's not zero-cost by any means. It also has some issues with Windows. I ended up having to use my own wrappers for epoll and kqueue, and used wepoll for Windows.
No crate namespacing, so you end up with crates like "yorickpeterse-socket2", "billy-bob-socket2", etc. This also means name squatting is more annoying.
This is not an issue with Rust itself, but is worth mentioning: I really can't stand Clippy. More often than not I upgrade it, and it introduces really annoying lints. For example, if you define len it will complain if you don't also define is_empty. This makes sense for a library, but when writing a self-contained application where you'd never use this it's annoying. Of course you can disable it, but I don't want to sprinkle Clippy directives all over the place.
No (computed) goto, or something that is guaranteed to compile down to it. This means interpreters won't be able to make use of them, slowing them down a bit (depending on the hardware)
Read More
要比较语言,莫过去用它们实现同一个项目/工程了。作者是一个学生,他们被布置实现一个Jave的子集到x86的编译器。不同的组用了不同语言自行实现。不过,这次这篇文章只是比较了实现同一个编译器需要用到的代码量。其实这个很不客观,因为不同小组实现同一个目标的设计思路和算法都不同。但是这还是能给人一点参考意义,至少知道一个大概的量级和复杂度。