毎度、慣れぬRustのお作法に行く手を阻まれます。今回は変数の型を表示しようとしてハマりました。実はRustの命名規則とか、お名前、キーワードにまつわるあれこれを知らないことが多すぎたです。Rustはスネークケースと思い込んでいたら「そうではなかった」し、見知らぬ予約語も密か?に隠してあったりして。
※「やっつけな日常」投稿順 indexはこちら
「まだ使われていない」予約語がある
まず最初は、予約されているけれども、使われていない予約語が結構ある件です。The Rust Reference から以下のページを開き、ページの下の方へとスクロールしてくだされ。
Reserved keywordsというサブタイトルの下に列挙されとります。中には box とか priv とか「つい使ってしまいそうな」キーワードも予約済です。今回、これを「踏んづけた」のは、型名を返す関数の御名前を(C/C++では演算子ですが) typeof としようとしてエラーになったんであります。typeof も予約されているが、まだ使われていないお言葉みたいです。何に使うつもりなのか?
Rustはスネークケースばかりじゃない
Rustを始めて直ぐに、変数名も関数名もスネークケース(abc_def みたいに単語をアンダバーでつないでいくスタイル)で書くのだ、というお作法をどこぞで読んだ記憶があります。しかし今回「ジェネリック」使おうとしたら型パラメータはスネークケースではないです。キャメルケース(AbcDefみたいな背中がデコボコするスタイル)みたい。まあ「ジェネリック」は、一文字、<T> みたいな書き方するのが普通(C#のジェネリック、C++のテンプレートなど)な気がするので、<T>と書いている分にはRustでも違和感ないのでありますが。
その辺どこかにお作法が書かれていないか調べたらありました。Rust APIガイドライン(非公式日本語訳)の中の日本語説明ページです。
この日本語ページの元になっているのが、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個です。
しかし、type_of()関数に仮引数 arg をおき、内部で使わないと、以下のようにwarning がでます(警告なので、実行は成功します。)
上記のメッセージが、アンダースコアを使えや、と言ってくれているので、arg でなく _arg とアンダースコアをつけると警告がでなくなります。どうもRustでも、この
_ アンダースコア
の使い方には「いろいろある」みたいです。そういえばPythonでも_のルールは独特だったし。。。Rustのアンダースコアをほじくるのはまた今度かな。
さらに std::any::type_name 関数が返してくる値の型はみたことないものです。
&’static str
&は参照を示す&でしょうが、「‘staticって何?」
staticは「ライフタイム」を制御するための魔法のお言葉みたいです。いつもお世話になっております「Rust By Example 日本語版」のページに解説ありました。
しかし、上記を見ると、Cの static キーワードみたいなものでしょ、といって押し通るのも問題あるときがあるみたいです。これもまた今度だな。
そして String ではなく str。これは文字列のスライスであります。String型だけでなくそのスライスもあるのだ、と。やること多すぎ、皆また今度。
ともあれ最初に掲げた短いプログラムを走らせると、以下のように変数型名「i32」が報告されます。
多少は Rust のお作法を習得できたのか?怪しいな、自分。