没错这就是输出的第一讲

因为Rust在各方面都很复杂,并不适合第一门语言学。即使有一定基础也要花很长时间入门。所以这里就是详解print!&println!的第一讲,后面还有很多要补充的

输出纯文本

在上一讲中的最后部分我们讲了创建项目,那么在cargo默认生成的项目中会有一个main文件在 yourprojectname/src/main.rs下打开之后会有初始化的代码如下

  1. fn main() {
  2. println!("Hello, world!");
  3. }

其中fn是定义一个函数。那么众所周知啊,编译器一上来就看main的内容,所以main是不可缺少的。println!是输出完成后换行命令,其定义为

  1. //官方定义 https://doc.rust-lang.org/std/macro.println.html
  2. macro_rules! println {
  3. () => { ... };
  4. ($($arg : tt) *) => { ... };
  5. }

和C的printf_s类似(切记切记,printf并没有安全类型检查所以和Rust的print!/println!)

print!和println!的唯一区别是一个输出后没有换行,一个输出后马上换行

所以接下来我会把两个放在一起讲。

输出数字

输出数字需要像C一样标记,标记符为 {}
故代码应为

  1. fn main() {
  2. println!("{}",123);
  3. }

结果为图片.png我们可以字符数字一起输出

  1. fn main() {
  2. println!("print:{}",123);
  3. }

图片.png可以多个数字字符一起输出

  1. fn main() {
  2. println!("print:{},and print:{}",123,456);
  3. }

图片.png

但是部分习惯和我们平时的习惯不太一样

比如换行只能使用println!()——设计者认为\n不好理解容易造成混乱的同时,为了输出\n还要再引入转义符,容易造成内存安全和维护不方便,强大的rustc不容易像提供其他疑难解答一样输出正确的报错信息。

事实上,rustc是所有语言中,报错系统和语法检查系统最强大的编译器,因为他编译一次需要经过LLVM的多次转译,其编译时间长和编译原理复杂也是这个原因。但是得益于LLVM,rust和C在部分性能测试中相差无几,甚至在部分场景下占用内存会比C少。

回到正题,换行的实现方法如下

  1. fn main() {
  2. println!("print:{}",123);
  3. println!();
  4. println!("next line");
  5. }

效果为
图片.png

这个print!/println!有多强大?

其标识符可以只能推导变量类型,基于let函数可以玩出很多花样,再比如标识符内还可以填集合下标等。