【Rust】chatGPTさんにRustのコードを書かせて自己学習してみる

徒然草2.0

結論から言えば、chatGPTによって教育ビジネスが終わる…というか様変わりするようになる気がするわ。

めっちゃ自分の学習効率がいい気がする。

Rustの学習をしている…前回はRustで標準入出力をさせてみたら結構つらいコードだと思った。外部からデータを書き込む時はexpectメソッドで例外処理を書かないといけない(たぶんこれはstdinを使った時のみの特殊なメソッドで一般的ではない)し変数型を定義しないといけないと思っていたが試しにchatGPTに「Rustで数値の要素が入った1次元配列をループさせて和を求めるコードを書いて下さい」と言ったら以下のコードを書いてくれた。

あれ?jsとかとそんなに遜色ないコードですねえ。

fn main() {
    let arr = [1, 2, 3, 4, 5];
    let mut sum = 0;
    for i in 0..arr.len() {
        sum += arr[i];
    }
    println!("sum = {}", sum);
}

変数の型宣言も見当たらないです。forのiなんかもfor文上で定義して使えるんですね。sumもミュータブルと自明でこれならスッキリして分かりやすい!という印象を受けました。

if文とelse-ifのサンプルコードを書いてもらいました。

fn main() {
    let x = 10;

    if x > 15 {
        println!("x is greater than 15");
    } else if x > 5 {
        println!("x is greater than 5 but less than or equal to 15");
    } else {
        println!("x is less than or equal to 5");
    }
}

うん。わかりやすい!プログラミング学習がはかどるし、他の言語へのコンバージョンもchatGPTは得意なんじゃないか?

いずれにしても、使う人の知識の引き出しがあればこそchatGPTの能力を引き出すことができるのかもしれない。

for in があることはわかったが他にwhileやforeachなどの繰り返し(イテレータ)はあるんだろうか?

fn main() {
    let mut i = 0;
    while i < 5 {
        println!("i = {}", i);
        i += 1;
    }
}

while文はあるらしい。

あ、そういえばpythonにはswitch文が無いらしいがrustにはswitch文があるんだろうか?

ちまたではswitchは不要だと言われているが…

そうしたら「switchはないけどmatchで似たような書き方ができるよ」と教えてくれた。

fn main() {
    let number = 3;
    match number {
        1 => println!("One"),
        2 => println!("Two"),
        3 => println!("Three"),
        4 => println!("Four"),
        _ => println!("Other"),
    }
}

もうこれRustができる人とディスカッションしている同等レベルかそれ以上なんですが…。びっくりですね。

まあただ、実行できるという意味だと正しいが、これが実務レベルや実用レベルで使っていいか?は別問題ですが。

じゃあGoTo文(ラベルジャンプ)の文法はあるんでしょうか?

Rustには、goto文はありません。goto文は、プログラムの制御フローを複雑にし、読みにくくメンテナンス性を低下させることが知られているため、現代のプログラミング言語では使用されていません。

ふーん。で、なぜかloopという無限にループさせる構文があることを教えてくれた。

while(true)やfor(;;)じゃダメなのだろうか???

for文で無限ループさせる書き方ができるか聞いてみた。

一応、「cycle」を使えば無限ループできるイテレータを実装できるそうなので、サンプルコードを書いてもらったが…loop文での書き方を推奨された。

let items = ["apple", "banana", "cherry"];
for item in items.iter().cycle() {
    // 無限に繰り返される処理をここに書きます
}

まあ、どう見てもこれはバッドノウハウですね。配列要素数に関係なく無限ループするというように直感的には読めません。でもcycleとかiterというメソッドが配列オブジェクト?にあるという発見がありました。無限ループは無限ループを目的にしたloopを用いる(というか無限ループ用の構文があるところがすごいですね。かつてのプログラミング言語にはない特徴である気がします)

さて、それはさておき。ハッシュとか連想配列と呼ばれるデータ構造はあるのでしょうか?プログラミングにおいて重要なデータ構造だと思います。というわけでたずねてみました。すぐに答えが帰ってきました。
…(phpで言うところの)連想配列は「MashMap」オブジェクト?を使って定義することができらしい。こんな感じ。

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();

    map.insert("apple", 100);
    map.insert("banana", 200);
    map.insert("cherry", 300);

    println!("{:?}", map);
}

println!のマクロでjson形式の文字列で出力するには:?を使えば良いということも丁寧に教えてくれている!かゆいところに手がとどくフォローはヤバい。そう標準出力のやり方も感覚的に行っているわけで、どういう方法で出力するか分かっていなかった。これってつまり私自身がこの辺の知識が浅いことを先回りして教えてくれているんだよね。

インストラクターとして超優秀じゃん!

徒然草2.0
スポンサーリンク
シェアする
gomiryoをフォローする
ごみぶろぐ

コメント

タイトルとURLをコピーしました