ChatGPTにRust言語を教えてもらったら動かないコード教えられたけど、修正もChatGPTがやってくれた

流行りに流行っているChatGPTがソースコードを書いてくれるというので、僕も試しにやってみました。

今回検証したいこと

全く知識のないRust言語でWebサーバーを立ち上げHello Worldを表示することができるのか。

ネット検索は一切使わずChatGPTに言われたとおりにやる。

もしこれができるならプログラミング学習の効率が格段に上がるでしょう。

やってみよう

ここからは実際に僕が入力したプロンプトとそのレスポンスのスクショを貼っていきます。

Rust言語を使ってHello Worldを表示するWebアプリケーションを作るためには、まず必要なツールとしてRustの開発環境をインストールする必要があります。Rustの開発環境をインストールした後に、以下の手順を実行することでWebアプリケーションを作成することができます。

まず、プロジェクトのディレクトリを作成し、その中にCargo.tomlという名前のファイルを作成します。

Cargo.tomlに以下の内容を追加します。
よくわからないけど、プロジェクトディレクトリを作成して Cargo.toml を作成せよとのこと。
次に、src/main.rsという名前のファイルを作成し、以下のコードを追加します。
src ディレクトリに main.rs を作成してコードをコピペしてみる。
最後に、ターミナルでプロジェクトのディレクトリに移動し、以下のコマンドを実行します。
cargo run
これで、Webアプリケーションが実行され、ブラウザでhttp://localhost:8080/にアクセスすると、「Hello World!」が表示されるはずです。

以上が、Rust言語を使ってHello Worldを表示するWebアプリケーションを作成する手順です。
cargo run コマンドでWebサーバーを立ち上げてlocalhost:8080にアクセスすると「Hello Word」が表示されるらしい。

ということで、実際にVSCodeを使ってコードを作成していきます。

ちなみに「まず必要なツールとしてRustの開発環境をインストールする必要があります。」とあるので、その方法も聞いてみました。

MacにRustの開発環境をインストールするためには、以下の手順を実行します。

Rustupのインストール
Rustupは、Rustプログラムをインストール、管理、アップグレードするためのツールです。

ターミナルを開き、以下のコマンドを入力して、Rustupをダウンロードおよびインストールします。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
インストール中に、利用規約に同意するかどうかを確認されます。同意する場合は、1を入力してEnterを押してください。
Rustのインストールコマンドを教えてもらいました。
Rustのインストール
Rustupを使用して、Rustの最新バージョンをインストールします。ターミナルに以下のコマンドを入力します。

rustup install stable
ビルドツールCargoの確認
RustのビルドツールであるCargoがインストールされていることを確認します。以下のコマンドを入力して、バージョンを確認します。

cargo --version
以上の手順で、MacにRustの開発環境をインストールできます。
よくわからないけど、言うとおりにやってみたらcargoのバージョンが確認できました。

やってみた、が、しかし

ここまでにかかった所要時間は約10分。では早速Webアプリケーションを立ち上げてみましょう。

cargo runを実行すると表示されるエラーメッセージ
あれあれ?

動きません。

ChatGPTさんの嘘つき。。。

エラーメッセージが書いてますが、Rustの知識が全く無いのでどう対処して良いのか、まるで見当がつきません。なので、対処方法もChatGPTに聞いてみます。

聞き方のコツとしては、表示されたエラーメッセージと書いたソースコードを両方プロンプトに入れます。

エラーの原因は、actix_rt crateを使用するために必要な依存関係が設定されていないためです。以下の手順を実行して依存関係を追加し、async fn main()をfn main()に変更してください。

Cargo.tomlに以下の内容を追加します。
main.rsファイルのasync fn main()をfn main()に変更します。
変更後のソースコード main.rs:
(コードは省略)
これで、再度cargo runコマンドを実行すれば、Webアプリケーションが正常に実行されるはずです。
淡々と修正方法を教えてくれます。

教えてもらったことをちょっと疑ってみる

解決策としては

  1. actix_rt の依存関係を Cargo.toml に追加せよ
  2. main.rs のコードを修正せよ

という内容でした。

しかしながら提示されたコードを見ると、追加した actix_rt を使わないコードに修正されているようです。これはなにかおかしいと思い、1番目の対応策だけを試してみることにしました。

そして再び cargo run を実行します。

今度はエラーメッセージが表示されず Running が表示されたままターミナルが停止しました。

成功したのかな?

試しに http://localhost:8080/ にアクセスしてみます。

localhost:8080
Hello World!が表示された!

お!予想通り正しく動きました!

ここまでの所要時間約15分。

ChatGPTにコードの解説を依頼する

さて、知識ゼロでもRustを使ってWebサーバーを立ち上げ、Hello Worldを表示することには成功しました。ですが、言われたとおりにやっただけなので、未だにRustの知識がほとんどありません。

ということで、書いたコードをChatGPTに解説してもらうことにしました。

Rustの知識が全く無いことをアピールしつつ解説を頼みました。

このコードは、RustのWebフレームワークであるActix Webを使用して、HTTPサーバーを起動し、Hello Worldを返すシンプルなWebアプリケーションを作成しています。

まず、useキーワードを使用して、actix_webモジュールから5つの要素をインポートしています。

get: HTTP GETメソッドを使用するためのマクロ
App: Actix Webアプリケーションを構築するための構造体
HttpResponse: HTTPレスポンスを表すための構造体
HttpServer: Actix Web HTTPサーバーを表すための構造体
Responder: Actix Webレスポンスを表すためのトレイト
次に、#[get("/")]というアトリビュートを使用して、HTTP GETメソッドでアクセスしたときに実行されるindexという関数を定義しています。

この関数は、asyncキーワードが付いているため、非同期関数として宣言されています。また、Responderトレイトを返すように指定されており、HttpResponse::Ok().body("Hello World!")というレスポンスを返します。
#[actix_rt::main]というアトリビュートは、Actix Webで非同期処理を実現するためのランタイムであるactix-rtを使用することを示しています。このアトリビュートは、非同期関数mainの定義に付けられています。

このmain関数は、asyncキーワードが付いているため、非同期関数として宣言されています。また、std::io::Result<()>を返すように指定されています。std::io::Resultは、I/Oエラーを表すための列挙型です。
HttpServer::new()メソッドは、HTTPサーバーを作成するために使用されます。このメソッドは、クロージャを引数として受け取り、そのクロージャは、HTTPサーバーが起動されたときに実行されます。

このクロージャは、App::new()メソ

途中で文字が途切れてしまったので、続きを促します。

#[actix_rt::main]は、actix_rtというcrateのマクロを使用しています。このマクロは、実行時に非同期ランタイムを設定するために使用されます。Actixは、非同期ランタイムの実行にtokioを使用することを前提としています。#[actix_rt::main]マクロがついたasync fn mainは、tokioランタイムを開始して非同期アプリケーションを開始します。

async fn main()の本体では、HttpServerを開始しています。HttpServerは、actix-web crateで定義されているWebサーバーの構造体です。bindメソッドは、HTTPリクエストを待ち受けるアドレスを指定しています。この例では、127.0.0.1のポート8080でリクエストを待ち受けています。runメソッドは、HTTPサーバーを開始し、リクエストを受信し、処理を行います。

最後に、awaitキーワードが使用されていることに注目してください。これは、非同期関数であるため、非同期操作の完了を待機しています。HttpServerは、awaitキーワードによって、HTTPサーバーが実行されるという事実を確認します。

ちょっと専門用語が多くて分かりませんが、丁寧にコードを解説してくれました。

わからないところは再びChatGPTに聞くか、ググればなんとかなりそうです。

なんとなく#[get("/")] アトリビューションを追加して #[get("/hoge")] とか作れば、ページを増やせるのかなと思いました。

やってみた感想

  • とりあえず言うとおりにやればコードはすぐできる
  • バグっていてもどこがおかしいか教えてくれる
    • 自分で書いたコードのデバッグもしてくれそう!
  • コードの解説をしてくれるのは便利
    • 他人が書いたコードを読むときに役立ちそう!

ということで、ChatGPTを使えばプログラミング学習の効率が上がりそうかという疑問に対して、上がりそうだし、普段の業務での使いみちも見えてきました。

面白いので皆さんも試してみてください。

この記事は役に立ちましたか?

⭐をクリックして評価してね!

Average 5 / 5. 投票数: 3

おめでとう!あなたがこの記事の最初の評価者です

役に立たなくて申し訳ありません…!

この記事の改善点を教えていただけますか?

SNSでもご購読できます。