普通人学习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 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); }
- 错误使用变量名作为占位符号,`{}`内的变量名跟外面的变量名是不一样的。
错误示例
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]
请发表评论