Beginng_rust(译):在终端上打印(第二章)

在终端上打印

在本章中,您将学习:

  • 如何在Rust语言中编写和运行您的第一个程序
  • 如何在终端上输出文本和数字
  • 如何编写一个小脚本,使编译器的输出更具可读性
  • 如何在代码中编写注释

如何开始

最短且有效Rust程序是:

fn main(){}

当然,它什么都不做。 它只定义了一个名为“main”的空函数。 “函数”是指一组执行某些操作并且已经命名的指令。

“fn”字是“function”的简写。 “main”字是函数的名称。 圆括号包含函数的可能参数; 在这种情况下,没有参数。 要关闭,大括号包含构成函数体的可能语句; 在这种情况下,没有声明。

当运行用Rust编写的程序时,执行其“main”b函数。 如果没有主要的“main”函数,那么它不是一个完整的程序; 但它可能是一个库。

要运行此程序,请完成以下操作:

  • 安装包含Rust编译器及其实用程序的包。 编译器可以从网站https://www.rust-lang.org免费下载。 可以使用处理器体系结构x86(32位)或x86-64(64位)的Linux,Windows或macOS平台。 对于每个平台,有三个版本:“稳定”(stable),“测试版(beta)”和“夜间(nightly)”。 建议使用“稳定”版本;它是最古老,也是最考验和一个不太可能改变。 所有这些程序版本都应该从控制台的命令行使用。安装后,要检查安装的版本,请在命令行键入(使用大写V):rustc -V。
  • 创建或选择将存储Rust练习的文件夹,并使用任何文本编辑器在该文件夹中创建名为“main.rs”的文件夹,其中包含上述内容。
  • 在命令行的文件夹中,键入:rustc main.rs. 在创建名为“main”的文件后,应立即打印出提示(在Windows环境中,它将命名为“main.exe”)。 实际上,“rustc”命令已经正确编译了指定的文件。 Tat是,它已经读取并生成相应的机器代码,并且它已将此机器代码存储在同一文件夹中。
  • 在命令行中,如果在Windows环境中键入:main对于其他操作系统,请键入:./ main。 您只需运行之前生成的程序,但应立即打印提示,因为此程序不执行任何操作。

Hello, World!

让我们看看如何在终端上打印一些文字。 将上一节的程序更改为以下内容:

fn main() {
print!("Hello, world!");
}

如果它像以前一样编译并运行,它会打印出:“Hello,world!”
请注意,新添加的行包含八个语法项,即“标记”。 我们来看看它们:

  • print:它是Rust标准库中定义的宏的名称。
  • !:它指定前面的名称表示一个宏。 没有这样的符号,打印将代替表示功能。 Tere在Rust标准库中没有这样的函数,因此您将收到编译错误。宏是一个类似于函数的东西 - 它是与名称相关联的一些Rust代码。 通过使用此名称,您要求在此处插入此类代码。
  • (:它启动宏的参数列表。
  • “:它启动文字字符串。
  • Hello,world!:它是文字字符串的内容。
  • “:它结束文字字符串。
  • ):它结束宏的参数列表。
  • ;:结束陈述。
    让我们来看看“文字字符串”短语的含义。 “字符串”一词的意思是“有限的字符序列,可能包括空格和标点符号”。 “文字”一词的意思是“带有直接在源代码中指定的值。”因此,“文字字符串”是“源代码中直接指定的有限字符序列(可能包括空格和标点符号)”。

print宏只是插入一些代码,在终端上打印作为参数接收的文本。

Rust总是区分大写和小写字母 - 它是“区分大小写”。 对于文字字符串和注释之外的所有字符,如果使用小写字母替换某些大写字母或相反,通常会出现编译错误,或者无论如何都会出现具有不同行为的程序。 相反,在文字字符串中创建这样的错误总是允许成功编译,但是程序的行为可能会有所不同。
例如:

fn Main() {}

如果编译此程序,则会出现编译错误“未找到主函数”,因为程序中未定义主函数(带小写的m)。
从现在开始,除非指定,否则我们将假设示例代码将位于“main”函数的大括号内,因此将省略大括号和它们之前的文本。

打印文字字符串的组合

您可以打印其中的几个字符串,而不是使用单个文字字符串,即使在单个语句中也是如此。 通过这种方式:

print!("{}, {}!", "Hello", "world");

这句话放在“main”函数的大括号内,将再次打印:“你好,世界!”。

在这种情况下,print宏接收三个参数,以逗号分隔。 所有三个参数都是文字字符串。 但是,第一个字符串包含两对大括号({})。 它们是占位符,表示插入其他两个字符串的位置。

因此,宏在第一个之后扫描参数,并且对于每个参数,它查看一对大括号的第一个参数,并用当前参数替换它们。

这类似于以下C语言语句:

printf("%s, %s!", "Hello", "world");

但是有一个重要的区别。 如果你试图编译:

print!("{}, !", "Hello", "world");

你得到编译错误“参数从未使用过”,因为第一个之后的宏的参数比第一个参数中的占位符更多; 也就是说,有一些论点没有任何相应的占位符。

如果你试图编译:

print!("{}, {}!", "Hello");

你得到一个编译错误,因为第一个参数中的占位符比第一个参数后面的参数更多; 也就是说,有一个占位符没有任何相应的参数。

相反,C语言中的相应语句不会引发编译错误,而是导致编译的程序崩溃或行为异常。

打印几行文本

到目前为止,我们编写的程序只打印一行。 但是单个声明可以打印几行; 通过这种方式:

print!("First line\nSecond line\nThird line\n");
This will print:
First line
Second line
Third line

字符序列\ n,其中n代表“新行”,由编译器转换为表示当前使用的操作系统的行终止符的字符序列。

鉴于每个打印语句仅对新行进行一次,并且在语句结束时非常常见,另一个宏“println”已添加到Rust标准库中。 它以这种方式使用:

println!("text of the line");

该陈述相当于:

print!("text of the line\n");


调用此println宏(其名称将被读作“print line”)等效于使用相同的参数调用print,然后输出行终止符。

打印整数

如果我们要打印整数,我们可以输入:

print!("My number: 140");

或者,使用占位符和附加参数:

print!("My number: {}", "140");

或者,删除第二个参数周围的引号:

print!("My number: {}", 140);

所有这些陈述都将打印出:“我的号码:140”。
在最后一个语句中,第二个参数不是文字字符串,而是一个“文字整数”,或者简称为“文字整数”。

对于字符串,整数是另一种数据类型。

即使对于整数,print宏也可以使用它们来替换其第一个参数中的相应占位符。

实际上,编译器将源代码中包含的字符串140解释为以十进制格式表示的数字,它以二进制格式生成等效数字,然后将其保存到可执行程序中。

在运行时,程序以二进制格式获取此数字,使用十进制表示法将其转换为字符串“140”,然后用该字符串替换占位符,从而生成要打印的字符串,最后将字符串发送到 终点站。

例如,此过程解释了为什么要编写以下程序:

print!("My number: {}", 000140);

编译器生成与之前生成的完全相同的可执行程序。 实际上,当源字符串000140被转换为二进制格式时,忽略前导零。

参数类型也可以混合使用。 这个说法

print!("{}: {}", "My number", 140);

将打印与以前相同的行。 这里第一个占位符对应于文字字符串,而第二个占位符对应于文字整数。

命令行脚本

上面显示的rustc命令有一个缺点:它按照找到它们的顺序打印它在代码中找到的所有错误。 好吧,通常你的代码会包含很多语法错误,你应该从第一个到最后一个处理它们。 但是在编译器完成打印错误之后,您将面临发现最后一个错误之前的新提示。 因此,您必须回滚到第一个错误。

改善这种情况的一种方法是使用命令行脚本,其语法取决于操作系统。

在Linux系统中,您可以将以下行放在新的脚本文件中:

clear
rustc $* --color always 2>&1 | more

在Windows系统中,您可以将以下三行放在.BAT文件中:

@echo off
cls
rustc %* --color always 2>&1 | more

如果脚本文件名为rs(Windows上的rs.bat),要编译名为main.rs的文件,可以键入:

rs main.rs

该脚本首先清除屏幕,然后使用您提供给它的所有参数运行rustc编译器。 如果编译成功,或者它生成的屏幕错误消息少于一屏,那么它的行为就像正常运行一样。

否则,它会在屏幕上显示错误消息,然后停止并显示
消息 - 更多 - 在终端屏幕的底部。 此时你可以按:…

  • Enter键,前进一行。
  • Te Space键,以一屏为前提。
  • Te Q键(用于“退出”),中止打印错误消息,然后返回到命令提示符。

注释

编写以下代码

// This program
// prints a number.
print!("{}", 34); // thirty-four
/* print!("{}", 80);
*/

这将打印34。

前两行以一对斜杠“//”开头。 这样的一对字符表示“行注释”的开始,结束于该行的结尾。 要在多行上写注释,必须在注释的每一行重复这对斜杠,如上面程序的第二行所示。

Rust程序员使用双斜杠后留空,以提高可读性。

当它出现在第三行时,行注释可能在语句后开始,通常由至少一个空格分隔。

还有另一种评论,在第四和第五行中举例说明。 这样的评论以字符对“/ ”开头,以“ /”对结束; 它可以在几行上扩展,因此它被命名为“多行注释”。Rust程序员通常只使用单行注释来避免生产代码中的多行注释,并且仅使用多行注释来暂时排除某些代码 来自编译。

Rust注释看起来与现代C语言注释相同。 事实上,Rust注释和C注释之间存在重要区别:Rust注释可能是嵌套的,并且它们必须正确嵌套。

/* This is /* a valid*/
comment, even /* if /* it contains
comments*/ inside */itself. */
/* This /* instead is not allowed in Rust,
while in C is tolerated (but it may generate a warning).*/

猜你喜欢

转载自blog.csdn.net/m0_37696990/article/details/82779703