やっつけな日常(31) Rustに入ればRustに従え、お名前のお作法、いろいろあるのよ

Joseph Halfmoon

毎度、慣れぬRustのお作法に行く手を阻まれます。今回は変数の型を表示しようとしてハマりました。実はRustの命名規則とか、お名前、キーワードにまつわるあれこれを知らないことが多すぎたです。Rustはスネークケースと思い込んでいたら「そうではなかった」し、見知らぬ予約語も密か?に隠してあったりして。

「まだ使われていない」予約語がある

まず最初は、予約されているけれども、使われていない予約語が結構ある件です。The Rust Reference から以下のページを開き、ページの下の方へとスクロールしてくだされ。

Keywords

Reserved keywordsというサブタイトルの下に列挙されとります。中には box とか priv とか「つい使ってしまいそうな」キーワードも予約済です。今回、これを「踏んづけた」のは、型名を返す関数の御名前を(C/C++では演算子ですが) typeof としようとしてエラーになったんであります。typeof も予約されているが、まだ使われていないお言葉みたいです。何に使うつもりなのか?

Rustはスネークケースばかりじゃない

Rustを始めて直ぐに、変数名も関数名もスネークケース(abc_def みたいに単語をアンダバーでつないでいくスタイル)で書くのだ、というお作法をどこぞで読んだ記憶があります。しかし今回「ジェネリック」使おうとしたら型パラメータはスネークケースではないです。キャメルケース(AbcDefみたいな背中がデコボコするスタイル)みたい。まあ「ジェネリック」は、一文字、<T> みたいな書き方するのが普通(C#のジェネリック、C++のテンプレートなど)な気がするので、<T>と書いている分にはRustでも違和感ないのでありますが。

その辺どこかにお作法が書かれていないか調べたらありました。Rust APIガイドライン(非公式日本語訳)の中の日本語説明ページです。

1. 命名

この日本語ページの元になっているのが、RFC 430 なんだそうな。しかし、

RFC(Request For Comment)といったらインターネットのあれ?

かと思いきや、RUSTにはRUSTのRFCがあるみたいです。ほえほえ~。知らんかった。ジェネリックの型パラメータについて「RUSTの」RFC430から引用すると

Type parameters concise UpperCamelCase, usually single uppercase letter: T

非公式日本語訳から引用させていただくと

型パラメータ 簡潔なCamelCase、大抵は大文字で1文字: T

となっておりました。他にも型とかトレイトとかキャメルケースにすべきお作法のものがあり。

変数の型名を返す関数を作成

ということで(どういうことだ?)変数を与えたらその型名を返すtype_of関数を作ってテストしてみました。こんな感じです。

fn type_of<T>(_arg: T) -> &'static str {
    let work = std::any::type_name::<T>();
    return work;
}

fn main() {<
    let v0: i32 = 255;
    println!("{0}", type_of(v0));
}

type_of()関数は引数に判別すべきターゲットの変数を取らざるを得ないのですが、引数の値を使うことがありません。以下の変数の型名を返す関数(ジェネリック)のドキュメントを見れば引数の個数は0個です。

Function std::any::type_name

上記に引数与えると以下のようにエラーになります。type_name_no_arg

しかし、type_of()関数に仮引数 arg をおき、内部で使わないと、以下のようにwarning がでます(警告なので、実行は成功します。)

unusedArg

上記のメッセージが、アンダースコアを使えや、と言ってくれているので、arg でなく _arg とアンダースコアをつけると警告がでなくなります。どうもRustでも、この

_ アンダースコア

の使い方には「いろいろある」みたいです。そういえばPythonでも_のルールは独特だったし。。。Rustのアンダースコアをほじくるのはまた今度かな。

さらに std::any::type_name 関数が返してくる値の型はみたことないものです。

&’static str

&は参照を示す&でしょうが、「‘staticって何?」

staticは「ライフタイム」を制御するための魔法のお言葉みたいです。いつもお世話になっております「Rust By Example 日本語版」のページに解説ありました。

スタティックライフタイム

しかし、上記を見ると、Cの static キーワードみたいなものでしょ、といって押し通るのも問題あるときがあるみたいです。これもまた今度だな。

そして String ではなく str。これは文字列のスライスであります。String型だけでなくそのスライスもあるのだ、と。やること多すぎ、皆また今度。

ともあれ最初に掲げた短いプログラムを走らせると、以下のように変数型名「i32」が報告されます。

Result

多少は Rust のお作法を習得できたのか?怪しいな、自分。

やっつけな日常(30) Rustに入ればRustに従え、モジュールを別ファイルにするお作法 に戻る

やっつけな日常(32) Rustに入ればRustに従え、文字列操作、おっかなびっくり その1 へ進む