Rust 1.2.0 翻译官网总结(一)

介绍

Rust 编程语言

欢迎学习本教程!本教程将教你如何使用 Rust 编程语言。Rust 是一门强调安全、性能和并发性的系统编程语言。它为了达到这几个目的,甚至没有一个垃圾收集器。这也使 Rust 能够应用到其他语言做不到的地方:嵌入到其他语言,有指定空间和时间需求的程序,写底层代码(如设备驱动程序和操作系统)。针对当前的其他编程语言,Rust 做到了没有运行时(Runtime),没有数据竞争。 Rust 也致力于实现“零成本抽象”,尽管这些抽象给人的感觉像一个高级的语言。即使是这样,Rust 仍然可以做到像一个低级的语言那样的精确控制。

“Rust 编程语言”分为七个部分。本文的简介是第一个。在这之后:

  • 新手入门 - 设置您的电脑来进行 Rust 开发。
  • 学习 Rust - 通过小型项目学习 Rust 编程。
  • 高效的 Rust - 学习编写优秀 Rust 代码的一些高级概念。
  • 语法和语义 - Rust 的每一部分,分解成小块来讲解。
  • 每日 Rust - 尚未构建稳定的一些高端特性。
  • 术语 - 本教程的相关参考科目。
  • 学术研究 - 影响 Rust 的一些著作。

阅读本文之后,你会想了解“学习 Rust”或“语法和语义”,根据你的喜好:如果你想尝试一个项目,可以学习 “学习 Rust”章节;或者如果你喜欢从小的部分开始,彻底的学习了一个概念之后才移动到下一个概念,那么你可以学习“语法和语义”章节。丰富的交叉联合使这些部分连接到一起。

贡献

本教程的源文件可以在 Github 上找到: github.com/rust-lang/rust/tree/master/src/doc/trpl

Rust 的一个简单介绍

Rust 是你可能会感兴趣的一门语言么?让我们先来看看一些能展示其一些优势的小代码示例。

让 Rust 变得独特唯一的一个主要的概念是名称为“所有权”的概念。思考下面这个小例子:

    fn main() {        let mut x = vec!["Hello", "world"];
    }

这个程序有一个变量绑定名称为 x。此绑定的值是一个 Vec<T>,是我们通过在标准库中定义的宏创建的一个‘向量‘。这个宏被称为 Vec,我们利用!调用宏用。这遵循 Rust 的一般原则:做事情要明确。宏可以有效的做一些比函数调用更复杂的东西,所以他们外观上来看是不一样的。这个符号!也有助于解析,使代码更容易编写,这也很重要。

我们使用 mut 使 x 可变:默认情况下,Rust 中的绑定是不可变的。我们将在后面的例子中改变此向量。

另外值得一提的是,在这里我们不需要标注类型:Rust 是静态类型,我们并不需要再明确标注类型。Rust 有类型推断,用以平衡强大的静态类型和冗长标注类型。

Rust 更倾向于堆栈分配而不是堆分配:x 被直接放置在堆栈中。然而,Vec<T> 类型是在堆上分配的向量元素的空间。如果你不熟悉它们之间的区别,那么你现在可以先忽略它,或者你可以查看章节“堆栈和堆”,来了解详细了解。作为一个系统编程语言,Rust 赋予了你如何分配内存空间的能力,但是在我们开始的阶段,这是并不是一个大问题。

此前,我们提到的“所有权”是铁锈的关键新概念。生锈的说法,X 被说成“自己”的载体。这意味着,当 x 超出范围,载体的存储器将被解除分配。这是由防锈编译确定性完成,而不是通过一个机制,诸如垃圾收集器。换句话说,在防锈,你不叫喜欢的 malloc 函数和释放自己:编译静态判断,当你需要分配或释放内存,并插入这些调用本身。犯错是做人,但编译器永远不会忘记。

前面我们所提到的,“所有权”是 Rust 中的一个非常重要的新概念。按照 Rust 的说法,x 被称为向量“所有”。这意味着当 x 超出范围,向量的内存将被销毁。这样做是由 Rust 的编译器所决定的,而不是通过一种机制(如垃圾收集器)所决定的。换句话说,在 Rust 中,你不需要自己调用函数,如 malloc 和 free yourself: 当你需要分配或释放的内存时,编译器会自行静态的决定并插入这些调用函数。犯错是人之常情,但编译器永远不会忘记插入这些调用的函数。

让我们在我们上面的例子中添加另外的一行代码:

    fn main() {        let mut x = vec!["Hello", "world"];        let y = &x[0];
    }

我们在此介绍了另外的一种绑定 ,y。在这种情况下,y 是向量第一个元素的一个“引用”。Rust 的引用与其他语言中的指针类似,不同的是有额外的编译时安全检查。特别指出的是,引用与所有权系统通过“借用”来相互作用,而不是通过拥有它。不同的是,当引用超出范围时,它不会释放底层的内存。如果是那样,我们将会释放两次内存,这是显然是不正确的!

让我们来添加第三行代码。表面上来是没错的,但是它会导致一个编译错误:

    fn main() {        let mut x = vec!["Hello", "world"];        let y = &x[0];

        x.push("foo");
    }

push 是将一个元素附加到向量组末端的方法。当我们试图编译这个程序时,我们将得到一个错误:

    error: cannot borrow `x` as mutable because it is also borrowed as immutable
        x.push("foo");
        ^    note: previous borrow of `x` occurs here; the immutable borrow prevents
    subsequent moves or mutable borrows of `x` until the borrow ends        let y = &x[0];
                 ^    note: previous borrow ends here
    fn main() {

    }
    ^

Rust 编译器给了很详细的错误,这是其中的一次。如错误解释中所说,虽然我们的绑定是可变的,但我们仍不能调用 push 方法。这是因为我们已经有了一个矢量元素的引用 ,y。当另外的一个引用存在时,改变某些变量是危险的行为,因为我们可能导致引用的无效。在这个特定的例子中,当创建向量时,我们可能只分配了三个元素的空间。添加第四个元素意味着所有这些元素将会被分配一块新的块内存,同时复制旧值到新内存,更新内部指针到新内存。这些工作都没有什么问题。问题是, y 不会更新,所以我们会有一个“悬空指针”。那就不对了。在这种情况下,任何的使用引用 y,将会导致错误,所以编译器已经帮我们捕捉到了这个错误。

那么,我们如何解决这个问题呢?有两种我们可以采用的方法。第一种方法,我们利用拷贝而不是一个引用:

    fn main() {        let mut x = vec!["Hello", "world"];        let y = x[0].clone();

        x.push("foo");
    }

在默认情况下,Rust 有移动语义,所有如果我们想要复制一些数据,我们可以调用 clone() 方法。在这个例子中 ,y 不再是存储在 x 中向量的一个引用,而是它的第一个元素“ Hello ”的一个副本。现在没有引用,我们的 push() 方法可以很好地运行。

如果我们真的想用一个引用,我们需要另外一种选择:确保在我们尝试做改变之前,我们的引用跳出其作用域。写法看起来像这样:

    fn main() {        let mut x = vec!["Hello", "world"];

        {            let y = &x[0];
        }

        x.push("foo");
    }

我们用一组额外的大括号创建了一个内部作用域。在我们调用 push() 之前,y 已经跳出其作用域。所以这样是可行的。

所有权的概念不仅有利于防止悬空指针,而且有利于解决与其相关的所有问题,如迭代器失效,并发性等等。

Rust 托管地址:http://wiki.jikexueyuan.com/project/rust/introduction.html

时间: 2024-11-10 07:31:51

Rust 1.2.0 翻译官网总结(一)的相关文章

[ActionScript 3.0] Away3D 官网实例

1 /* 2 3 Dynamic tree generation and placement in a night-time scene 4 5 Demonstrates: 6 7 How to create a height map and splat map from scratch to use for realistic terrain 8 How to use fratacl algorithms to create a custom tree-generating geometry

AngularJS系列-翻译官网

公司之前一直用的Web前台框架是Knockout,我们通常直接叫ko,有看过汤姆大叔的KO系列,也有在用,发现有时候用得不太顺手.本人是会WPF的,所以MVVM也是比较熟悉的,学ko也是很快就把汤姆大叔的文章系列看完了,但是ko有时候会有意想不到的问题,同事也有这样的反应,所以就度娘了一下.就找到了AngularJS和KO的对比文章<從Knockout到AngularJS>,看了之后不明觉厉.其实早在AngularJS刚刚问世的那年,因为我订阅了博友--梦想天空(山边小溪)的博客(这里得特别感

Android 5.0 开发者官网知识结构疏理

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. Quicknav 设计 Design 开发 Develop 发布 Distribute Links Google Play Developer C

React翻译官网文档之JSX

什么是JSX? 看下面的代码它被称为JSX,它既不是字符串也不是HTML,而是一种facebook公司对javascript语法的拓展.虽然写法很奇怪最终仍会会被编译为javascript代码 const element = <h1>Hello, world!</h1>; 你可以在JSX中嵌入任何javascript表达式,看下面的例子. function formatName(user) { return user.firstName + ' ' + user.lastName;

翻译官网QJN的Architecture:

在HA的集群里头,两台独立的机器会被个配置成为一个NameNode.在任何时刻,只能有一个namenode是active的,另外一个是standby状态.active的namenode是负责来自client的所有请求操作,而standby则在待命随时准备成为active的namenode. 为了保持namenode active和namenode standby 之间的同步,两个namenode之间通过一个叫做JournalNodes的守护进程来保持同步的.当namenode active的na

Android 7.0行为变化—开发者应该关注的(官网同步翻译)

Android 7.0行为变化-开发者应该关注的(官网同步翻译) 版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com 如果想了解更多Android7.0的内容,可以顺便再看看Android7.0写给开发者的一封信(官网同步翻译). 如果你的引文够好,推荐你阅读官网文章: Android 7.0 Behavior Changes Android N 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍你应该了解并在开发应用

Vlang官网文档(中文翻译)-vlang中文文档--v0.1.0_20180625

PS:主要为自己学习,,,,看的时候顺便翻译的,,,渣翻(非全人工)勿喷. 介绍 V是一种用于构建可维护软件的静态类型编译编程语言. 它与Go相似,也受到Oberon.Rust.Swift的影响. V是一种非常简单的语言,阅读这份文档大概只需要半小时的时间,读完之后,您将学习到V的全部内容. 尽管很简单,但是它为开发人员提供了很多功能,你能用其它编程语言做的任何事情,都可以用V做到. Hello World fn main() { println('hello world') } 函数用 fn

Reveal常用技巧(翻译来自Reveal官网blog)

翻译来自官网:http://revealapp.com/blog/reveal-common-tips-cn.html 以下基于Reveal 1.6. 用于快速上手的内置应用 刚刚下载Reveal,啥都还没配置呢,想先随便玩玩看,怎么办? 我们花了不少时间开发这个复杂程度类似与实际场景的Sample应用──Soundstagram(音频分享版的Instagram, ¯\_(ツ)_/¯),就是为了让大家能最快速地上手Reveal,尝试它的各种强大功能. 在 Help 菜单项中,点击 Inspect

ng2响应式表单-翻译与概括官网REACTIVE FORMS页面

本文将半翻译半总结的讲讲ng2官网的另一个未翻译高级教程页面. 原文地址. 文章目的是使用ng2提供的响应式表单技术快速搭出功能完善丰富的界面表单组件. 响应式表单是一项响应式风格的ng2技术,本文将解释响应式表单并用来创建一个英雄详情编辑器. 包含内容: 响应式表单介绍 开始搭建 创建数据模型 创建响应式的表单组件 创建组建的模板文件 引入ReactiveFormsModule 显示HeroDetailComponent 添加一个FormGroup 看看表单模型 介绍FormBuilder 验