🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

2回答

5219閲覧

proconio クレートが使えない。

takadaibuoyancy

総合スコア17

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2021/02/23 14:28

Rustにおける標準入力の手段として、proconioクレートのinput!マクロを使いたいのですが、エラーが出てしまいます。

Rust

1use proconio::input; 2fn main() { 3 input!{ 4 a:i32, 5 b:i32, 6 } 7 println!("a = {},b = {}",a,b); 8}

エラー表示は以下の通りです。

error[E0432]: unresolved import `proconio` --> input.rs:1:5 | 1 | use proconio::input; | ^^^^^^^^ maybe a missing crate `proconio`? error: cannot determine resolution for the macro `input` --> input.rs:3:5 | 3 | input!{ | ^^^^^ | = note: import resolution is stuck, try simplifying macro imports error[E0425]: cannot find value `a` in this scope --> input.rs:7:30 | 7 | println!("a = {},b = {}",a,b); | ^ not found in this scope error[E0425]: cannot find value `b` in this scope --> input.rs:7:32 | 7 | println!("a = {},b = {}",a,b); | ^ not found in this scope error: aborting due to 4 previous errors Some errors have detailed explanations: E0425, E0432. For more information about an error, try `rustc --explain E0425`.

またRustの標準入力手段として、ネットではこうではなく、文字列として受け入れていくつかのメソッドを用いて得るものが多く見られる気がします。proconio::input!が使われない理由はなんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

AtCoder以外の競技プログラミングコンテストでは使えないからAtCoderでもproconioは使わないと言う人を見たことがあります。(ちなみにinput!自体はシンプルなマクロなのでコピー&ペーストか自動展開ツール(例1, 例2)を使うことで容易に他コンテストサイトに持ち込むことができます。私も手製のinput!を用意しています。)

またproconioはrust-analyzer (RA)との相性が悪く、現在のRAでも生成する変数は認識されても変数の型が認識されないという問題があります。これを嫌ってマクロを使わない標準入力ユーティリティを作っている人もいます。(理由はわかりませんが手製のinput!だと大丈夫だったりしますが。)

RAでの型の認識

またAtCoderでRustが使えるようになったのが2016年input!が提唱されたのが2018年proconioがAtCoderに導入されたのが2020年なのでRustの標準入出力に関する記事が書かれているのが主に2016年から2017年であることを考えると、素朴な方法を推奨している記事はそもそもinput!の存在を考慮していないものが多いんじゃないかと思います。

投稿2021/02/23 18:46

編集2021/02/23 18:48
qryxip

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ご質問のRustコードを試してみましたが、私の環境ではエラーなくビルド、実行できました。

質問者さまの環境でエラーになっている原因として、ざっと思いつくのは以下のようなものです。

  • Cargo.tomlファイルのdependenciesセクションにproconioが書かれていない
  • Cargo.tomlファイルのpackageセクションにedition = "2018"が書かれていない
  • cargoコマンドを使わず、直接rustcコマンドを実行することでビルドしようとしている

私が試したときの手順を書きますので、その通りやってみてください。

console

1## cargo newコマンドで、hello-proconioという名前のパッケージを作る 2$ cargo new hello-proconio 3 4$ cd hello-proconio 5 6## Cargo.tomlファイルを編集して、以下の内容にする。 7$ cat Cargo.toml 8[package] 9name = "hello-proconio" 10version = "0.1.0" 11edition = "2018" 12 13[dependencies] 14proconio = "0.4" # この行を追加する 15 16## src/main.rsファイルを編集して、以下の内容にする 17$ cat src/main.rs 18use proconio::input; 19 20fn main() { 21 input! { 22 a: i32, 23 b: i32, 24 } 25 println!("a = {},b = {}", a, b); 26} 27 28## ビルドして、実行する 29$ cargo run

またRustの標準入力手段として、ネットではこうではなく、文字列として受け入れていくつかのメソッドを用いて得るものが多く見られる気がします。proconio::input!が使われない理由はなんでしょうか?

私は誰かがproconio::input!を使わないと言っているのを聞いたことがないので、理由についてはわかりません。競技プログラミングのAtCoderで提出されたプログラムを見るとproconioが使われていることもあります。

理由として考えられそうなのは、以下のようなものでしょうか。

  • 単にproconioを知らない
  • ネットの記事が書かれたのが、proconioが作られるより前だった
  • AtCoder以外の競技プログラミングのサイトではproconioが使えないので、自作のコードスニペットを使っている

投稿2021/02/23 15:46

tatsuya6502

総合スコア2046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takadaibuoyancy

2021/02/24 09:26

tomlファイルを指摘された通り編集したらできるようになりました。
tatsuya6502

2021/02/24 11:12

使えるようになってよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問