【RUST学习日记】第4课 Rust规范

简介: 【RUST学习日记】第4课 Rust规范

0x00 回顾


上一节咱们了解了Rust的常见IDE,选择一款好的IDE可以让你写代码时事半功倍哦~。这节咱们了解下Rust的常见的一些规范和约定。学习一门编程语言就好比学习一门外语,要“入乡随俗”,尊重这门语言的习惯。

0x01 程序入口点


咱们已经来到第四节了,大家应该也发现了,每次创建项目都会生成一个默认的函数——main,当然在Java中叫方法。这个main函数就是这个程序的入口点,对于所有的二进制可执行文件来说,main函数是必要的,没有它程序则没有执行入口,也就无法执行了。

fn main(){
}

简单了解下它的构造。声明函数以fn开头,fnfunction的简写,然后再紧跟着函数名称main,再加上参数,由于main函数没有参数,所以不需要声明参数,然后再跟上花括号,花括号里就可以写代码了。

PS:关于函数将会在后续章节中详细介绍,这里了解即可。

0x02 main函数的参数和返回值


看到这里,如果你了解过其它语言肯定会想,Rust中的main方法竟然没有参数,也没有返回值。是不是有点儿颠覆了你的“三观”。

fn main() {
    for arg in std::env::args()
    {
        println!("{}", arg);
    }
    // 返回值,默认返回是0
    std::process::exit(0);
}

其实,在Rust中有专门的函数对入参做处理——std::env::args(),他可以接收所有参数。大家可以点进源码看下注释,注释写的很详细。关于函数的返回值,可以使用std::process::exit(0);返回,其中的入参就是返回值了。


0x03 命名规范


1、蛇形命名法(Snake Case)


文件名:例如:hello_world.rs、main_xxx.rs

变量名:例如:zhangsan_name

函数名:例如:func_name()


2、大驼峰命名法(Camel Case)


结构体:例如:struct ExampleStruct { name: String}

enum类型:例如:enum IpAddress {IPV4(u8,u8,u8,u8)}


3、其它


关联常量:全部大写,例如:NAME、AGE

连接符Cargo默认把连接符-”转换成下划线_

语句:跟C,Java语言等一样,每行语句结束都要添加;

PS:Rust也不建议以-rs”或“_rs”为后缀来命名包名,如果以此来命名,会强制性的将此后缀去掉。


0x04 标准输出


在前面的文章中,咱们都了解了使用println!去打印内容,现在具体介绍下它。

在Rust中常见的输出指令有如下红框圈出的四种。下图来自Rust官方文档。


微信图片_20230107144951.jpg

printprintln 的区别就是多了一个lnprint是输出内容(不换行),println是输出内容并且换行。同理,eprinteprintln是一样的。


Q:printeprint有什么区别呢?


如果你在代码中运行发现不了区别。那还是看文档吧。


微信图片_20230107144951.jpg

文档中写道,输出由stderr来代替了stdout,那就很清晰了。有其它语言基础的同学应该清楚这个问题。简单介绍下这俩的区别:


stdout : 标准输出设备。默认是行缓冲的,它的输出数据会保存在一个buffer中,当换行的时候会输出到屏幕。如果程序转向输出到文件,它则会输出到文件里面。


stderr : 标准错误输出设备 。默认是无缓冲的,会直接输出数据。如果程序转向输出到文件,它则依然会输出到屏幕。


咱们就用文件做个测试,上代码:

fn main() {
    println!("我是 println!");
    eprintln!("我是 eprintln!");
}


微信图片_20230107144951.jpg

右侧蓝框:两行数据都打印了,看不出区别。


左侧红框:输出到test.txt文件,在终端输出了eprintln打印的内容,在文件中输出println的内容。


PS:想更深入的了解它们的区别,大家可以百度下~关于println在后续章节还会再次介绍。


0x05 dbg!


如果你想要调试输出,建议使用dbg!,这个命令是对eprintln的封装。通过它打印内容,输出内容会带文件名,行号等信息,可以很方便的程序调试。建议需要打印日志时使用dbg!来代替println!。下节正式进入Rust的学习。


PS:使用dbg!需要在Rust的1.32.0版本(包含)之后。


示例代码如下:

dbg!("我是一条 debug 日志");


0x06 资料


print文档 - https://links.jianshu.com/go?to=https%3A%2F%2Fdoc.rust-lang.org%2Fstd%2Findex.html%3Fsearch%3Dprint

std::dbg文档 - https://links.jianshu.com/go?to=https%3A%2F%2Fdoc.rust-lang.org%2Fstd%2Fmacro.dbg.html

相关文章
|
2月前
|
存储 Rust 网络协议
【Rust学习】10_定义枚举
在这一章我们学习 枚举(enumerations),也被称作 enums。枚举允许你通过列举可能的 成员(variants) 来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后,我们将学习 if let 结构,另一个简洁方便处理代码中枚举的结构。
47 7
|
3月前
|
Rust 算法 安全
学习Rust
【10月更文挑战第13天】学习Rust
67 8
|
3月前
|
Rust 安全 算法
Rust的学习
【10月更文挑战第12天】Rust的学习
34 2
|
3月前
|
Rust 算法 安全
如何学习Rust编程?
【10月更文挑战第12天】如何学习Rust编程?
70 1
|
4月前
|
Rust 索引
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
108 2
|
3月前
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
30 0
|
4月前
|
存储 Rust 编译器
【Rust学习】07_结构体说明
**struct**或 ***structure***是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么**struct**就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。
38 1
|
5月前
|
存储 Rust 安全
【Rust学习】06_切片
所有权、借用和切片的概念确保了 Rust 程序在编译时的内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。
33 1
|
4月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
6月前
|
存储 Rust 安全
【Rust学习】04_所有权
所有权是 Rust 最独特的特性,对语言的其余部分有着深远的影响。它使 Rust 能够在不需要垃圾收集器的情况下保证内存安全,因此了解所有权的运作方式非常重要。在本章中,我们将讨论所有权以及几个相关功能:借用、切片以及 Rust 如何在内存中布局数据。
39 1