普通人學習rust——從零到放棄 簡單輸入輸出
環境
本文章內容基於如下環境,如若出入請參考當前環境。
rustc 1.42.0 (b8cedc004 2020-03-09)
cargo 1.42.0 (86334295e 2020-01-31)
前言
實用的程序須要有交互操作,本篇簡單講rust的輸入和格式化輸出
輸入
main.rs文件
use std::io;
fn main(){
println!("請輸入姓名:");
let mut name = String::new();
//讀取一個字符串
io::stdin().read_line(&mut name);
//必須使用占位符
println!("你好! {}", name);
}
use std::io;
使用use
關鍵字做為包的導入,let
為定義變量關鍵字,mut
為可變變量關鍵字,String::new()
相當於new String()
。吐槽:你看String::和io::,String是類,io也是類?一個開頭大小一個開頭小寫!至於雙冒號的寫法,既然你要學js的let為什么不使用空格作為類的創建,或者直接使用函數的點號
read_line(&mut name)
注意傳入參數須帶&
和mut
,這涉及到rust的借用與引用的概念。吐槽:rust不僅函數定義時要加&和mut,調用時也要加&和mut,重復的寫真有必要!
{}
為格式化占用符合,下面內容會說到。
編譯
rustc main.rs
warning: unused `std::result::Result` that must be used
--> main.rs:6:2
|
6 | io::stdin().read_line(&mut name);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_must_use)]` on by default
= note: this `Result` may be an `Err` variant, which should be handled
這里有一些輸出警告,先不用管它,這涉及到rust的異常管理。
運行結果
請輸入姓名:
小明
你好! 小明
輸出
這里只是簡單介紹用法,詳細格式化專門一篇文章去講。println!
和print!
是rust的輸出打印函數,rust使用大括號{}
為占位符號。寫法為:{語法}
。
- 不能直接打印變量,`println!`不能直接打印變量。
錯誤示例
fn main(){ let a="這是一段字符串"; println!(a); }
編譯錯誤
error: format argument must be a string literal --> index.rs:3:11 | 3 | println!(a); | ^ | help: you might be missing a string literal to format with | 3 | println!("{}", a); | ^^^^^ error: aborting due to previous error
正確寫法
fn main(){ let a="這是一段字符串"; println!("{}",a); }
吐槽:臃腫的語法!
- 是宏函數,需要加感嘆號
錯誤示例
fn main(){ let a="這是一段字符串"; println("{}",a); }
編譯錯誤
error[E0423]: expected function, found macro `println` --> index.rs:3:2 | 3 | println("{}",a); | ^^^^^^^ help: use `!` to invoke the macro: `println!` error: aborting due to previous error For more information about this error, try `rustc --explain E0423`.
正確寫法
fn main(){ let a="這是一段字符串"; println!("{}",a); }
- 可以指定序號,位置從0開始,如果沒有指定則按順序排位
正確寫法
fn main(){ let a=123; let b=234; println!("{1}+{0}={2}",a,b,a+b); }
運行結果
234+123=357
正確寫法
fn main(){ let a=123; let b=234; println!("{}+{1}={2}",a,b,a+b); }
運行結果
123+234=357
- 錯誤使用變量名作為占位符號,`{}`內的變量名跟外面的變量名是不一樣的。
錯誤示例
fn main(){ let pi=3.14; println!("圓周率={pi}",pi); }
編譯錯誤
error: there is no argument named `pi` --> index.rs:3:16 | 3 | println!("圓周率={pi}",pi); | ^^^^ error: argument never used --> index.rs:3:22 | 3 | println!("圓周率={pi}",pi); | ------------- ^^ argument never used | | | formatting specifier missing error: aborting due to 2 previous errors
正確寫法
fn main(){ println!("圓周率={pi}",pi=3.14); }
運行結果
圓周率=3.14
如果就要打印,已經存在的變量怎么辦?可以這么寫
fn main(){ let pi=3.14; println!("圓周率={pi}",pi=pi); }
運行結果
圓周率=3.14
吐槽:所以這樣寫的意義何在!
參考資料
- println宏函數文檔[https://doc.rust-lang.org/std/macro.println.html]