
概要
-
- Python しかわからねえマンが
-
- さっき始めたばかりの Rust を使って
- 入出力をキメる
材料を調達
-
- 確認用のprintinを見ながら文字列を学ぶ
- 文字を入力させたいので、Pythonで言うところのinputができるようにしたい
Print の仕組みから学ぼう
とりあえず前回の記事でHello Worldはできたので、
今回はPrintを取り扱っていきます。
とにかく変数を文字列として Print する
fn main() {
let text = "aaaa";
println!("{}", text);
}
// aaaa
let ~で変数を宣言
“{}”, ~という書き方。
出力したいところに{}を置く。
それをあとから~で置き換えるイメージ
「一般的に {}はどんな引数であろうと自動的に置き換えられます。」
フォーマットしてプリント – Rust By Example 日本語版
文字列を改行したい
- 改行したい場合は開改行を差し込めば改行される。
fn main() {
let text = "aa
aa";
println!("{}", text);
}
// -----出力
// aa
// aa
// -----出力
“と”;の間であれば、実際に改行していても認識されるらしい。
この場合、インデントになっているスペースも文字列に含まれるので取扱に注意が必要。
fn main() {
let text = "aa
aa
aa";
println!("{}", text);
}
// -----出力
// aa
// aa
// aa
// -----出力
input の初歩
Python の場合、こういう記述で一発で input ができます。
便利ですね。
s = input('文字列を入力してください >>>> ')
Rust ではどう書くか
ところが、Rust では input が一発でできないみたいです。
調べたらマクロ?というものを組む必要があるらしいんですが、
初学者が手つけたら死ぬなと思ったので、おとなしく諸々を書いていきます。
fn main() {
println!("フォルダの名前は?
>>>> ");
let mut title = String::new();
// 入力機構
stdin().read_line(&mut title).ok().expect("Error");
// 改行コードを抹消
title = title.trim().to_string();
println!("'{}'", title);
}
// -----出力
// フォルダの名前は?
// >>>>
// test(と入力)
// 'test'
// -----出力
-
- ミュータブルな変数を宣言して
std::io::stdin()は.read_lineを呼び出す前菜のようなものですかね
.read_line(&mut title)で入力
それをtitleにそれを書き込んで
ok()で指差し確認、ヨシ!
expect()で万が一だめなときでも、ヨシ!
このままだと末端に改行コードが挿入されてしまう
のでtrim()してto_string()で整える(?)
…ってところでしょうか、あんまり良くわかっていません。
マクロを書く書き方が主流みたいなので、
慣れたらそっちのほうが良さげです。
わかりやすくするために見た目を整えよう
ただ、このままだと
>>>>
test
'test'
という風に出力されてしまいます。
Python ライクに扱いたいので…
>>>> test
'test'
と出力したい…なにか方法ないのかな…
…あるじゃん。
use std::io::Write;
fn main() {
print!("フォルダの名前は?
>>>> ");
std::io::stdout().flush().unwrap();
let mut title = String::new();
std::io::stdin().read_line(&mut title).ok().expect("Error");
title = title.trim().to_string();
println!("'{}'", title);
}
use std::io::Write; は Python で言うところのimport ~
とにかくWriteの中にflush()というものがあるということでよろしく
print!を使うと改行コードが末尾に付加されずに済む
ただflush()を使わないと順番通りにいかないとのことなので入れておく(※)
※flush()がどういうものなのか、
公式ドキュメント読んでもよくわからなかったので
有志の方いたらコメントください…
これで理想通り
>>>> test
'test'
と出力されるようになりました。
関数
出力はうまくいきましたが、問題はこれを何度も書かなきゃいけないことです。
めんどくさいね…fn main()使ってるくらいだから関数化しちゃおうか。
ということでできました。
use std::io;
use std::io::Write;
// inputを扱う関数、引数はない
fn input() -> String {
print!(">>>> ");
std::io::stdout().flush().unwrap();
let mut word = String::new();
io::stdin().read_line(&mut word).ok();
return word.trim().to_string();
}
fn main() {
println!("1?");
let a = input();
println!("2?");
let b = input();
println!("結果");
println!("'{}'", a);
println!("'{}'", b);
}
関数の考え方は Python と同じで良いようです。
1?
>>>> aaaa
2?
>>>> bbbb
結果
'aaaa'
'bbbb'
参考
-
- フォーマットしてプリント – Rust By Example 日本語版
-
- Rust で 100 本ノック: 標準入力からの文字入力と数値変換|ぐは| note
-
- 【Rust】コンソールにて文字列を入力し、結果を print にて出力させる方法 – Magidropack’s blog
-
- Rust で print と read_line を 1 行にする方法 – やってみる
- 文字列 – Rust | nju33