28 private links
The Documentation of PartialEq states that implementations must be transitive: for all for all a, b and c, a == b and b == c implies a == c. This is followed by a note indicating that the transitivity must also hold if a, b, and c are of...
Rust で Box<T>
が特殊に扱われている理由とか歴史的経緯。
最近の Rust エコシステムでは no_std
環境でスピンロックを使うような慣習があるが、スピンロックには重大な欠点がある。
よくできた (std や parking_lot
crate の) mutex ではスピンロックと同等かそれ以上のパフォーマンスが出るため、安易にスピンロックを使うべきでないという話。
スピンロックで起きる問題のサンプルコード付き。
They (
std
やparking_lot
の mutex) already do a small amount of spinning iterations before calling into the kernel, so they are as fast as a spinlock in the best case, and infinitely faster in the worst case.(注釈は引用者による)
また、軽量なロックを使いたい場面としてよくあるのが「一回きりの初期化」だが、この場合筆者の作った once_cell
crate が有用だとのこと。
rust と cargo は、変更を加えると Mozilla による explicit approval がないと rust や cargo という名前で呼ぶことができない。
これは、 Rust と Cargo の名前が Mozilla の商標として管理されているため。
このポリシーのせいで、 distro 側でパッチとか当てる運用に支障が出るしユーザの自由を奪っている、という話らしい。
(旧ページ: Rust's Freedom Flaws)
Because that way a generic error printer can render out something like
error: Connection error (could not connect to foo) caused by: io error (ECONNRESET)
instead of
error: io error (io error (ECONNRESET)) caused by: io error (ECONNRESET)
Which is what I'm observing frustratingly commonly.
MyErrorEnum::Io(std::io::Error)
ではなく MyErrorEnum::ConnectionError(std::io::Error)
のようにすべきで、前者のような情報を加えないラッパーは面倒という話。
たしかに。