0x90

一回休み

Rustの知見もろもろ

モジュールを書いてたら幾つか知見が溜まってきたのでメモ

モジュールの構成について

クレートとモジュール

を見るといい感じである。外のファイルから見えてもいいものはpub修飾子を付けておく。

なお、src直下のlib.rsでmod hogeとするとhoge.rs、あるいはhoge/mod.rsが読まれるようになる。*/mod.rs中でも再帰的に公開するものを選べる。

また、lib.rsでpub use fugaしておくとuse hogemoduleした場合hogemodule::fugaで子モジュールfugaを参照できる。

例えばpythonだと無条件で全公開だったので一瞬面食らったが、まあそういえばJavaとかこんな感じであった。

生ポインタ

基本的にやろうと思えば結構かんたんに生のポインタを持ってこられる。

"あいう".as_ptr();
(vec![1, 2, 3]).as_ptr();

など。メモリ確保はmallocを叩くか、

let mut buf = vec![0u8; N];
buf.as_mut_ptr();

とかでもよい。確保したメモリをforgetすることもできる。

std::vec::Vec - Rust

こんなことだってできるようだ。

また、ポインタ系のキャストはすべてas *const hoge, as *mut hogeでよい。transmuteの必要はない。offsetを使えばCでのポインタの足し算相当の事もできる。transmuteしてstd::mem::size_of::<fuga>() * lenを足してもっかいtransmuteして、、、とかはしなくて良い。

さすがCの後釜を狙うだけあって、かなり簡単にローレベルまで突っ込むことができる。

文字列の扱い

そのままlen()とするとバイト長が返ってくる。例えば"あいう".len()なら9。UTF-8として解釈した場合の文字数等々が欲しければ、

let s = "あいう";
let us: Vec<char> = s.chars().collect();

とかしてus.len()とか呼べばいい。

Associated methodをinstanceから呼べるか

呼べない。Javaとかでもできるし呼べてほしい。マクロ中で詰む。

マクロ中での型情報、引数の長さ

多分できない。できてほしいもんだけど。