const-and-static.mdcommit 024aa9a345e92aa1926517c4d9b16bd83e74c10dRust有一个用const关键字定义常量的方法:const N: i32 = 5;与[let](Variable Bindings 变量绑定.md)绑定不同,你必须标注一个const的类型。常量贯穿于整个程序的生命周期。更具体的,Rust中的常量并没有固定的内存地址。这是因为实际上它们会被内联到用到它们的地方。
crates-and-modules.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4当一个项目开始变得更大,把它分为一堆更小的部分然后再把它们装配到一起被认为是一个好的软件工程实践。另外定义良好的接口也非常重要,这样有些函数是私有的而有些是公有的。Rust 有一个模块系统来帮助我们处理这些工作。
ufcs.mdcommit 024aa9a345e92aa1926517c4d9b16bd83e74c10d有时,函数可能有相同的名字。就像下面这些代码:trait Foo { fn f(&self);}trait Bar { fn f(&self);}struct Baz;impl Foo for Baz { fn f(&self) { println!("Baz’s impl of Foo"); }}impl Bar for Baz { fn f(&self) { println!("Baz’s impl of Bar");
closures.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4有时为了整洁和复用打包一个函数和自由变量(free variables)是很有用的。自由变量是指被用在函数中来自函数内部作用域并只用于函数内部的变量。对此,我们用一个新名字“闭包”而且 Rust 提供了大量关于他们的实现,正如我们将看到的。语法闭包看起来像这样:let plus_one = |x: i32| x + 1;
trait-objects.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4当涉及到多态的代码时,我们需要一个机制来决定哪个具体的版本应该得到执行。这叫做“分发”(dispatch)。大体上有两种形式的分发:静态分发和动态分发。虽然 Rust 喜欢静态分发,不过它也提供了一个叫做“trait 对象”的机制来支持动态分发。
if-let.mdcommit 797a0bd1c13175398aa0e2e45f6dbb61bcb8c329if let允许你合并if和let来减少特定类型模式匹配的开销。例如,让我们假设我们有一些Option<T>。我们想让它是Some<T>时在其上调用一个函数,而它是None时什么也不做。这看起来像:# let option = Some(5);# fn foo(x: i32) { }match option { Some(x) => { foo(x) }, None =>
drop.mdcommit 024aa9a345e92aa1926517c4d9b16bd83e74c10d现在我们讨论了 trait,让我们看看一个由 Rust 标准库提供的特殊 trait,Drop。Drop trait提供了一个当一个值离开作用域后运行一些代码的方法。例如:struct HasDrop;impl Drop for HasDrop { fn drop(&mut self) { println!("Dropping!"); }}fn main() { let x = HasDrop;
traits.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4trait 是一个告诉 Rust 编译器一个类型必须提供哪些功能语言特性。你还记得impl关键字吗,曾用[方法语法](Method Syntax 方法语法.md)调用方法的那个?struct Circle { x: f64, y: f64, radius: f64,}impl Circle { fn area(&self) ->
generics.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4有时,当你编写函数或数据类型时,我们可能会希望它能处理多种类型的参数。幸运的是,Rust有一个能给我们更好选择的功能:泛型。泛型在类型理论中叫做参数多态(parametric polymorphism),它意味着它们是对于给定参数(parametric)能够有多种形式(poly是多,morph是形态)的函数或类型。
strings.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4对于每一个程序,字符串都是需要掌握的重要内容。由于Rust主要着眼于系统编程,所以它的字符串处理系统与其它语言有些许区别。每当你碰到一个可变大小的数据结构时,情况都会变得很微妙,而字符串正是可变大小的数据结构。这也就是说,Rust的字符串与一些像C这样的系统编程语言也不相同。
vectors.mdcommit 5b9dd6a016adb5ed67e150643fb7e21dcc916845“Vector”是一个动态或“可增长”的数组,被实现为标准库类型Vec<T>(其中<T>是一个[泛型](Generics 泛型.md)语句)。vector总是在堆上分配数据。vector与切片就像String与&str一样。你可以使用vec!宏来创建它:let v = vec![1, 2, 3, 4, 5]; // v: Vec<i32>
method-syntax.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4函数是伟大的,不过如果你在一些数据上调用了一堆函数,这将是令人尴尬的。考虑下面代码:baz(bar(foo));我们可以从左向右阅读,我们会看到“baz bar foo”。不过这不是函数被调用的顺序,调用应该是从内向外的:“foo bar baz”。如果能这么做不是更好吗?foo.bar().baz();
patterns.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4模式在Rust中十分常见。我们在[变量绑定](Variable Bindings 变量绑定.md),[匹配语句](Match 匹配.md)和其它一些地方使用它们。让我们开始一个快速的关于模式可以干什么的教程!快速回顾:你可以直接匹配常量,并且_作为“任何”类型:let x = 1;match x { 1 => println!("one"), 2 =>
match.mdcommit fc4bb5f77060b5822f25edbabbdf7a1d48a7f8fe一个简单的[if](If If语句.md)/else往往是不够的,因为你可能有两个或更多个选项。这样else也会变得异常复杂。Rust 有一个match关键字,它可以让你有效的取代复杂的if/else组。看看下面的代码:let x = 5;match x { 1 => println!("one"), 2 => println!("two"), 3 => println!
enums.mdcommit 31e39cd05c9b28c78b087aa9314f246b0b0b5cfaRust 中的一个enum是一个代表数个可能变量的数据的类型。
structs.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4结构体是一个创建更复杂数据类型的方法。例如,如果我们正在进行涉及到 2D 空间坐标的计算,我们将需要一个x和一个y值:let origin_x = 0;let origin_y = 0;
mutability.mdcommit 024aa9a345e92aa1926517c4d9b16bd83e74c10d可变性,可以改变事物的能力,用在Rust中与其它语言有些许不同。可变性的第一方面是它并非默认状态:let x = 5;x = 6; // error!我们可以使用mut关键字来引入可变性:let mut x = 5;x = 6; // no problem!这是一个可变的[变量绑定](Variable Bindings 变量绑定.md)。
lifetimes.mdcommit f4fac9b0fa55d253b438eccdf1794baace6c9efe这篇教程是现行 3 个 Rust 所有权系统之一。所有权系统是 Rust 最独特且最引人入胜的特性之一,也是作为 Rust 开发者应该熟悉的。Rust 所追求最大的目标 -- 内存安全,关键在于所有权。所有权系统有一些不同的概念,每个概念独自成章:[所有权](5.8.Ownership 所有权.md),关键章节[借用](5.9.
references-and-borrowing.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4这篇教程是现行 3 个 Rust 所有权系统之一。所有权系统是 Rust 最独特且最引人入胜的特性之一,也是作为 Rust 开发者应该熟悉的。Rust 所追求最大的目标 -- 内存安全,关键在于所有权。所有权系统有一些不同的概念,每个概念独自成章:[所有权](5.8.Ownership 所有权.
ownership.mdcommit fcc356373bba8c20a18d26bc81242c77c4153089这篇教程是现行3个Rust所有权系统之一。所有权系统是Rust最独特且最引人入胜的特性之一,也是作为Rust开发者应该熟悉的。Rust所追求最大的目标 -- 内存安全,关键在于所有权。所有权系统有一些不同的概念,每个概念独自成章:所有权,你正在阅读的这个章节[借用](5.9.
关注时代Java