Open2

初学者がRustに触れて感じたこと

センシティブ先輩@<破壊者>センシティブ先輩@<破壊者>

ごあいさつ

●初めまして!!ダークネコだよー(死)

私が今を時めく言語である(?)Rustに触れて感じたことを記述します。

技術記事というより、私の感想なので「それってあなたの感想ですよね?」と言われたら
「Yes I do」と回答するしかない可哀そうなネコでござる。

●悪魔でもサタン様でもルシファー様でも(?)

※ルシファー様の邪悪な瞳が光る✨✨

感じたことなので、無意味な情報として君の脳の片鱗に焼き付けてくれればいいよ。
(炎の刻印は記憶の魔術と密接に関連しているのだから!!) ー出典:とある少女漫画

感じたことリスト💛

  • くそ難しい言語や・・・
  • コンパイラにとっては逆に理解しやすいのか?
  • 設計思想が言語の制約に現れていてかつすごくメモリ管理がしやすいように見える
  • クレートが多すぎて使えるクレートがごく一部に見えた
  • よく考えてコード書かないとRustの恩恵を活かせないコードにもなりそう・・・

感じたことリスト💚(それぞれの・・・理由!)

くそ難しい言語

●これはやってる人(ラストシアン様!!!!)ならわかると思うけど
くそ難しいのよ。何が難しいって

  • 型同士の整合性が取れてないとエラー
  • 所有権を理解してコード書かないとエラー
  • 書きたいコード書くときにうまくクレートを使わないといけないのだが、使い方ミスるとエラー
  • その他!!!!!!!(^q^)

こんなに書いたけど、他にもあるからな!!!( ゚Д゚)

コンパイラにとっては逆に理解しやすいのか?

●逆にコンパイラにとっては理解しやすいのかと勝手に思っている・・・いや、
感じているーーーーっ(^^♪
以下理由

  • 例えばjavaのガベージコレクションは複雑な仕組みで実装されていると【聞いた】が・・・
    Rustにはガベージコレクションの仕組みがない。
    所有権システムという制約のみでガベージコレクションを不要かつ最適なメモリ管理ができるように設計されている!!
  • 生成AIに質問したらほとんど正確なコードが返ってくる。
    これは、生成AIの力もあるだろうけどRustがコンパイラにとって理解しやすいのかと思った根拠
  • 実行すると早いみたい

すごいよな、Rust💎

設計思想が言語の制約に現れていてかつすごくメモリ管理がしやすいように見える

●絶対にコーディングでやらせたくないことについては「制約」されていて
それのおかげでコードがうまくかけるようになっている。
また、推奨された書き方もあるみたいだ。(ゴゴゴゴゴゴゴ・・・)

  • Rustにはnullがない。その代わりResult型Option型で処理を実装できるようになっている
    これは???(誰だっけ?)さんが「わしがnullを許したせいで、nullはわしらを許さなかった・・・損害を与えたのじゃ・・・10億ドル・・・返してくれええええ(泣)」という名言に由来する
  • Rustの関数はデフォルトでプライベート。これはデフォルトがパブリックなKotlinとは一線を画す。書きやすさよりも正確さ・セキュリティ・バグの減少を目指したものと考えられる

クレートが多すぎて使えるクレートがごく一部に見えた

●例えば、crates.ioを見てほしい・・・
こんなにクレートあったらいくつ見ても探しきらんは!!!
(クッ、これが「情報化社会」の「弊害」か・・・助けてくれー( *´艸`))

???:情報が、情報がああああああっ!
なぞのじじい:くっくっく、計画通り。「機械がわしらから仕事を奪う。「機会」すらもな!ふぉふぉふぉっ・・・」
勇者ヒーメル:こんな理不尽、抗ってやる!!
フリーレレ:ヒーメルならそう言うね

※勇者の獰猛かつ勇敢な上目遣い(死)に注目!!

よく考えてコード書かないとRustの恩恵を活かせないコードにもなりそう・・・

●いろいろ書きますたが、Rustはメモリ管理を最適化されている言語だと「個人的に」思ってます。
また、ルシファー様もそう思っております。
はるか昔に遡れば、聖徳太子も「将来Rustという言語が世界を導く、ああ伝説は本当だったのか!」とつぶやいていました。
そのくらいメモリ管理が最適化されていて、かつコンパイラもほぼほぼ模範解答を示してくれます。

だが、こいつを見てくれ。
こいつをどう思う?
???:すごく、大きい、です(⋈◍>◡<◍)。✧♡
阿部:だろう!ガハハハッ!!✞✞(/ω\)✞✞

<メモリ管理が能率悪いRustコード例>

fn main() {
    let add_man = 666;
    let add_woman = 1313;

    // 関数呼び出し
    let novita_kiss = jaiko_is_big_red_baka(add_man, add_woman);

    // その他の処理・・・
    let love = "愛してるよ、伸びた。";
    let hate = "いやだー!!( ;∀;) ぼくは静馬(しずが)ちゃんと結婚するんだ(愛)";

    // テストデバッグ
    println!("{}", love.clone());
    println!("{}", hate.clone());

    // 文字列結合
    let mut union_jaiko_novita = love
        .clone()
        .to_string()
        .push_str(&(format!("{}{}", "\n", hate.clone())));
    // そして出力
    println!("{:?}", union_jaiko_novita);

    // 答えの出力
    println!("novita kiss jaiko: {} kai", novita_kiss);
}

fn jaiko_is_big_red_baka(value_a: i32, value_b: i32) -> i32 {
    // デバッグログ(開始)
    println!("I am a jaiko");

    // 処理内容
    let answer = value_a + value_b;

    // デバッグログ(終了)
    println!("I am a jaiko, you kiss I");

    // 戻り値
    return answer;
}

???:きっ、きたねえコードだ!!げろ以下の臭いがプンプンするぜぇぇぇぇ!

・・・ではなく、メモリ管理的にもよろしくない箇所があります。
それは・・・賢明な…ラストシアン様の・・・勇者・・・ヒン・・・メル・・・なら・・・そう言う・・・?
そう、正解は「所有権がうざいからって、clone()をしまくっていることです!!」
(正解者に拍手👏👏)

では、参照に直していきまっしょい!!!

<多少きれいになったRustコード??>

fn main() {
    let add_man = 666;
    let add_woman = 1313;

    // 関数呼び出し
    let novita_kiss = jaiko_is_big_red_baka(add_man, add_woman);

    // その他の処理・・・
    let love = "ジャイモ様:わたし、キレイ?? 永遠の命を手に入れた、私、キレイ??";
    let hate = "伸びたはカルチャーショックを受けた。 なぜなら、ジャイモ様は腐っていた!!早すぎたんだΣ!!!";

    // テストデバッグ
    println!("{}", &love);
    println!("{}", &hate);

    // 文字列結合
    let mut union_jaiko_novita = &love.to_string().push_str(&(format!("{}{}", "\n", &hate)));
    // そして出力
    println!("{:?}", union_jaiko_novita);

    // 答えの出力
    println!("novita kiss jaiko: {} kai", novita_kiss);
}

fn jaiko_is_big_red_baka(value_a: i32, value_b: i32) -> i32 {
    // デバッグログ(開始)
    println!("I am a jaiko");

    // 処理内容
    let answer = value_a + value_b;

    // デバッグログ(終了)
    println!("I am a jaiko, you kiss I");

    // 戻り値
    return answer;
}

以上ですっ!!
いやー、Rustは難しいですねぇ。引き続きがんばっていきまっしょい!!

まあ、それはそうと、まだ【Rustのドキュメントをすべて読み切れていないのですけどね!!】
ハハッ!!

じゃあまたな、運命が導けばいつだって僕たちは巡り遭うだろう!
来世で会おう!!