# Hello, world!
现在你已经安装好了Rust,让我们开始写第一个Rust程序吧。作为一个传统,你任何新语言的第一个程序应该在屏幕上打印出“Hello, world!”。写这么一个小程序有一个好处就是你可以确认你安装的Rust编译器不仅仅是装上了而已。并且在屏幕上打印信息是一件非常常见的事情。
你需要做的第一件事就是创建一个用来写代码的文件。我喜欢在home目录下创建一个projects文件夹,用来存放我的所有项目。Rust并不关心你的代码位于何处。
这里确实有另一个导致我担心的地方:这个教程假定你熟悉基本的命令行操作。Rust并不要求你非常了解命令行,但是直到这个语言到达一个更加完善的地步,IDE支持将是十分差劲的。Rust并不对你使用的编辑工具和代码位置有特定的要求。
既然这么说了,让我们在projects目录下新建一个目录
~~~
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
~~~
如果你使用Windows并且没有用PowerShell,`~`可能无效。查询你所使用的Shell的文档以获取更多信息。
接下来让我们新建一个源文件。在本例中我使用`editor filename`这种语法来代表编辑一个文件,不过你应该使用自己的编辑器。我们叫源文件`main.rs`:
~~~
$ editor main.rs
~~~
Rust源文件总是使用`.rs`后缀。如果你使用了多个词,使用下划线分隔。写成`hello_world.rs`而不是`helloworld.rs`。
现在打开你的源文件,键入如下代码:
~~~
fn main() {
println!("Hello, world!");
}
~~~
保存文件,然后在终端中输入如下命令:
~~~
$ rustc main.rs
$ ./main # or main.exe on Windows
Hello, world!
~~~
你也可以在[play.rust-lang.org](https://play.rust-lang.org/)中运行这个例子。你可以将鼠标放到代码上方,然后点击出现在右上角的箭头运行代码(明显这里文档已经过时,上面那个网址已经改版,点击evaluate按钮运行脚本,同时还可以查看汇编和LLVM IR等)。
搞定这些,让我们回过头来看看到底发生了什么
~~~
fn main() {
}
~~~
这几行定义了一个Rust函数。`main`函数是特殊的:这是所有Rust程序的开始。第一行表示“我定义了一个叫main的函数,没有参数也没有返回值。”如果有参数的话,它们应该出现在括号(`(`和`)`)中。因为我们并没有返回任何东西,我们可以完全省略返回类型。我们稍后将谈论这些。
你会注意到函数被大括号(`{`和`}`)包围起来。Rust要求大括号中包含所有函数体。将左大括号与函数定义置于一排并留有一个空格被认为是一个好的代码格式。
接下来是这一行:
~~~
println!("Hello, world!");
~~~
这一行做了我们这小程序的所有工作。这里有一些细节比较重要。第一,缩进是4个空格,而不是制表符(Tab)。请设置你的编辑器Tab键为插入4个空格。我们提供[多种编辑器的配置例子](https://github.com/rust-lang/rust/blob/master/src/etc/CONFIGS.md)。
第二点是`println!()`部分。这是一个Rust宏,是Rust元编程的关键所在。如果你使用函数的话应该写成`println()`。在这里,我们并不用担心这两者的区别。只需记住,有时你会看到一个`!`,那代表你调用了一个宏而不是一个普通的函数。有很多理由使得Rust实现了`println!`宏而不只是一个函数,不过这涉及一些非常高端的话题。你会在我们谈论宏的时候了解更多。最后提醒一点:Rust宏与C语言的宏有显著区别,万一你用过C语言宏的话。使用宏时请不要恐惧。我们最终会仔细研究它,现在你只需相信我们。
下一部分,`"Hello, world!"`是一个字符串。在一门系统编程语言中,字符串是一个复杂得令人惊讶的话题。这是一个静态分配的字符串。我们将在后面讨论更多不同的分配方式。我们把这个字符串作为参数传递给`println!`,而它负责在屏幕上打印字符串。就这么简单!
最后,这一行以一个分号结尾(;)。Rust是一门_面向表达式_(expression oriented)的语言,也就是说大部分语句都是表达式。分号用来表示一个表达式的结束,另一个新表达式的开始。大部分Rust代码行以分号结尾。我们将在后面更深层次地讨论这个问题。
最后,让我们实际编译和运行我们的程序。我们可以使用编译器`rustc`,用我们的源文件名作为参数:
~~~
$ rustc main.rs
~~~
这跟`gcc`或`clang`类似,如果你有C或C++知识背景。Rust会输出一个可执行文件。你可以用`ls`查看它:
~~~
$ ls
main main.rs
~~~
或者在Windows下:
~~~
$ dir
main.exe main.rs
~~~
现在这里有两个文件:我们`.rs`后缀的源文件,和可执行文件(在Windows下为`main.exe`,其它平台是`main`)。
~~~
$ ./main # or main.exe on Windows
~~~
这将在终端上打印出`Hello, world!`。
对于来自像Ruby,Python或者Javascript这样的动态类型语言的同学,可能不太习惯这样将编译和执行分开的行为。Rust是一门_预先编译语言_(_ahead-of-time compiled language_),这意味着你可以编译一个程序,把它给任何人,他们都不需要安装Rust就可运行。如果你给他们一个`.rb`,`.py`或`.js`文件,他们需要先安装Ruby/Python/Javascript,不过你只需要一句命令就可以编译和执行你的程序。这一切都是语言设计的权衡取舍,而Rust已经做出了它的选择。
祝贺你!你已经正式完成了一个Rust程序。你现在是一名Rust程序猿了!欢迎入坑←_←
接下来,我将向你介绍另外一个工具,Cargo,它用来编写真实世界的Rust程序。仅仅使用`rustc`可以很好应对简单的程序,但是当你的项目不断增长,你将会一个工具帮助你管理所有可能的选项,帮助你更加轻松的与别人和别的项目分享代码。
- 前言
- 1.介绍
- 2.准备
- 2.1.安装Rust
- 2.2.Hello, world!
- 2.3.Hello, Cargo!
- 3.学习Rust
- 3.1.猜猜看
- 3.2.哲学家就餐问题
- 3.3.其它语言中的Rust
- 4.高效Rust
- 4.1.栈和堆
- 4.2.测试
- 4.3.条件编译
- 4.4.文档
- 4.5.迭代器
- 4.6.并发
- 4.7.错误处理
- 4.8.外部语言接口
- 4.9.Borrow 和 AsRef
- 4.10.发布途径
- 5.语法和语义
- 5.1.变量绑定
- 5.2.函数
- 5.3.原生类型
- 5.4.注释
- 5.5.If语句
- 5.6.for循环
- 5.7.while循环
- 5.8.所有权
- 5.9.引用和借用
- 5.10.生命周期
- 5.11.可变性
- 5.12.结构体
- 5.13.枚举
- 5.14.匹配
- 5.15.模式
- 5.16.方法语法
- 5.17.Vectors
- 5.18.字符串
- 5.19.泛型
- 5.20.Traits
- 5.21.Drop
- 5.22.if let
- 5.23.trait对象
- 5.24.闭包
- 5.25.通用函数调用语法
- 5.26.包装箱和模块
- 5.27.`const`和`static`
- 5.28.属性
- 5.29.`type`别名
- 5.30.类型转换
- 5.31.关联类型
- 5.32.不定长类型
- 5.33.运算符和重载
- 5.34.`Deref`强制多态
- 5.35.宏
- 5.36.裸指针
- 6.Rust开发版
- 6.1.编译器插件
- 6.2.内联汇编
- 6.3.不使用标准库
- 6.4.固有功能
- 6.5.语言项
- 6.6.链接参数
- 6.7.基准测试
- 6.8.装箱语法和模式
- 6.9.切片模式
- 6.10.关联常量
- 7.词汇表
- 8.学院派研究
- 勘误