RustRust入门


备注

Rust是一种专为安全性,速度和并发性而设计的系统编程语言。 Rust有许多编译时功能和安全检查,以避免数据争用和常见错误,所有这些都具有最小到零的运行时开销。

版本

稳定

发布日期
1.17.0 2017年4月27日
1.16.0 2017年3月16日
1.15.1 2017年2月9日
1.15.0 2017年2月2日
1.14.0 2016年12月22日
1.13.0 2016年11月10日
1.12.1 二○一六年十月二十○日
1.12.0 2016年9月30日
1.11.0 2016年8月18日
1.10.0 2016年7月7日
1.9.0 2016年5月26日
1.8.0 2016年4月14日
1.7.0 2016年3月3日
1.6.0 2016年1月21日
1.5.0 二零一五年十二月十日
1.4.0 2015年10月29日
1.3.0 2015年9月17日
1.2.0 2015年8月7日
1.1.0 2015年6月25日
1.0.0 2015年5月15日

Beta版

预计发布日期
1.18.0 2017年6月8日

入门

安装

在使用Rust编程语言执行任何操作之前,您将需要获取它 - 用于Windows或在类Unix系统上使用终端,其中$ symbol输入到终端:

$ curl https://sh.rustup.rs -sSf | sh
 

这将检索所需的文件并为您设置最新版本的Rust,无论您使用何种系统。有关更多信息,请参阅项目页面

注意:某些Linux发行版(例如Arch Linux )提供了一个包装rustup ,可以安装。虽然许多类Unix系统提供rustccargo 作为单独的包,但仍然建议使用rustup 因为它使管理多个释放通道和交叉编译变得更加容易。

Rust编译器

我们现在可以通过在我们的终端(如果在UNIX上)或命令提示符(如果在Windows上)运行以下命令来检查Rust是否实际上已成功安装到我们的计算机上:

$ rustc --version
 

如果此命令成功,安装到我们计算机上的Rust编译器版本将显示在我们眼前。

货物

使用Rust来Cargo ,这是一个用于管理Rust包和项目的构建工具。为了确保您的计算机上也存在此问题,请在控制台控制台内部执行以下命令,指向终端或命令提示符,具体取决于您所使用的系统:

$ cargo --version
 

就像Rust编译器的等效命令一样,这将返回并显示当前版本的Cargo

要创建您的第一个货物项目,您可以前往Cargo

或者,您可以使用rustc 直接编译程序,如最小示例所示。

println的高级用法!

println! (及其兄弟, print! )提供了一种方便的机制,用于生成和打印包含动态数据的文本,类似于许多其他语言中的printf 系列函数。它的第一个参数是一个格式字符串 ,它指示其他参数应该如何作为文本打印。格式字符串可能包含占位符(包含在{} )以指定应发生替换:

// No substitution -- the simplest kind of format string
println!("Hello World");
// Output: Hello World

// The first {} is substituted with a textual representation of
// the first argument following the format string. The second {}
// is substituted with the second argument, and so on.
println!("{} {} {}", "Hello", true, 42);
// Output: Hello true 42
 

在这一点上,你可能会问: println! 怎么样println! 知道打印布尔值true 为字符串“true”? {} 实际上是对格式化程序的指令,应该使用Display trait将值转换为text。这个特性是针对大多数原始的Rust类型(字符串,数字,布尔值等)实现的,并且用于“面向用户的输出”。因此,数字42将以十进制形式打印为42,而不是二进制打印,这是它在内部存储的方式。

我们如何打印类型,然后, 没有实现Display ,例如切片( [i32] ),向量( Vec<i32> )或选项( Option<&str> )?没有明确的面向用户的文本表示(即你可以轻易插入一个句子)。为了便于打印这些值,Rust还具有Debug 特性和相应的{:?} 占位符。从文档:“ Debug 应该在面向程序员,调试上下文中格式化输出。”我们来看一些例子:

println!("{:?}", vec!["a", "b", "c"]);
// Output: ["a", "b", "c"]

println!("{:?}", Some("fantastic"));
// Output: Some("fantastic")

println!("{:?}", "Hello");
// Output: "Hello"
// Notice the quotation marks around "Hello" that indicate
// that a string was printed.
 

Debug 也有一个内置的漂亮的打印机制,您可以通过使用enable # 冒号后修改:

println!("{:#?}", vec![Some("Hello"), None, Some("World")]);
// Output: [
//    Some(
//        "Hello"
//    ),
//    None,
//    Some(
//        "World"
//    )
// ]
 

格式字符串允许您表达相当复杂的替换

// You can specify the position of arguments using numerical indexes.
println!("{1} {0}", "World", "Hello");
// Output: Hello World

// You can use named arguments with format
println!("{greeting} {who}!", greeting="Hello", who="World");
// Output: Hello World

// You can mix Debug and Display prints:
println!("{greeting} {1:?}, {0}", "and welcome", Some(42), greeting="Hello");
// Output: Hello Some(42), and welcome
 

println! 如果你试图做一些不起作用的事情,而不是在运行时崩溃,朋友们也会警告你:

// This does not compile, since we don't use the second argument.
println!("{}", "Hello World", "ignored");

// This does not compile, since we don't give the second argument.
println!("{} {}", "Hello");

// This does not compile, since Option type does not implement Display
println!("{}", Some(42));
 

在它们的核心,Rust打印宏只是围绕format! 包装format! 宏,它允许通过将不同数据值的文本表示拼接在一起来构造字符串。因此,对于上面的所有示例,您可以替换println! 对于format! 存储格式化的字符串而不是打印它:

let x: String = format!("{} {}", "Hello", 42);
assert_eq!(x, "Hello 42");
 

没有宏的控制台输出

// use Write trait that contains write() function
use std::io::Write;

fn main() {
    std::io::stdout().write(b"Hello, world!\n").unwrap();
}
 
  • std::io::Write 特征是为接受字节流的对象设计的。在这种情况下,使用std::io::stdout() 获取标准输出的句柄。

  • Write::write() 接受一个字节切片( &[u8] ),它是用字节串文字( b"<string>" )创建的。 Write::write() 返回Result<usize, IoError> ,它包含写入的字节数(成功时)或错误值(失败时)。

  • Result::unwrap() 的调用表明调用预期成功( Result<usize, IoError> -> usize ),并且该值被丢弃。

最小的例子

要在Rust中编写传统的Hello World程序,请创建一个名为hello.rs 的文本文件, hello.rs 包含以下源代码:

fn main() {
    println!("Hello World!");
}
 

这定义了一个名为main 的新函数,它不接受任何参数并且不返回任何数据。这是程序在运行时开始执行的地方。在里面,你有一个println! ,这是一个将文本打印到控制台的宏。

要生成二进制应用程序,请通过向其传递源文件的名称来调用Rust编译器:

$ rustc hello.rs

生成的可执行文件将与主源模块具有相同的名称,因此要在Linux或MacOS系统上运行该程序,请运行:

$ ./hello
Hello World!

在Windows系统上,运行:

C:\Rust> hello.exe
Hello World!