【译】 第二章:读取用户输入

本文翻译自:Hecto, Chapter 2: Reading User Input – Philipp Flenker – Engineering Manager,封面图也来源自此。 我们尝试读取一下用户的按键信息。在 main 函数中删除“Hello, world”,然后像下面这样修改代码: 到 Github 查看这一步。 运行一下这个程序,尝试搞清楚它是怎样运行的。按下 CTRL-C 来停止这个程序。 首先,我们要使用 use 导入一些东西到我们的程序中。我们要利用系统的输入/输出(简称为 io)做一些事情。因此,我们使用 use std::io::{self, Read} 来导入 io 库,该命令是下面的简写: use std::io; use std::io::Read; 之后,我们就可以在我们的代码中使用 io 库。并且通过引入 Read 到代码中,我们就能使用bytes()。尝试跑一下你没导入 Read 的代码,编译器会退出并打印 『Read 需要被引入到作用域(Scope)中』错误,因为 Read 会导入 bytes() 的实现。 # 译者注:最终报错信息如下 **help: the following trait is implemented but not in scope; perhaps add a `use` for it: | 1 | use std::io::Read; |** 这个概念被称作 Trait ,我们会在后面的教程中深入了解。关于 traits 的文档是你必须要读的! ...

April 10, 2022 · 4 min · 扬扬得意

【译】 第一章:安装环境

2023.2.1 —— 润色语句,减少翻译腔。 本文翻译自 Hecto, Chapter 1: Setup – Philipp Flenker – Engineering Manager,封面图也来源自此。 哈哈,第一步。难道你不喜欢在一块空地上的全新开始吗?然后选择一块砖,在上面建造属于你的整个宫殿。 扫兴的是,万事开头难。当你要开发一个计算机程序时,第一步有点……困难并且还容易让人觉得挫败。你必须确保(开发)环境是为你所使用的程序设计语言设计的,而且你必须知道怎样在该环境下编译和运行程序。 令人欣慰的是,安装 Rust 的开发环境是相当轻松容易的,除了一个文本编辑器,Rust 和 Cargo 外,我们不需要别的东西。为了安装这些程序,我们将使用一个叫作 rustup 的程序,当然也有其他的方式来安装和运行 Rust(译者注:推荐使用 rustup 这种安装方式)。 如果你使用 Linux 或者任意 Unix 系统包括 MacOS,按照下面的步骤做就好。如果你在 Windows 平台,你需要使用 Linux 系统。最简单的方法是使用 Linux 的 Windows 子系统(WSL),它在 Windows 10 上面可用。你也可以在 Windows 上安装和运行 Rust,不过,在你跟随教程学习的过程中,很快会遇到问题,并且无法完成本教程。 在 2019 年, 本教程发布之后发生了很多变化。其中之一是本教程用到的一个库,现在有一个可以运行在 Windows 电脑上的替代品了。一旦我们介绍到这一部分,我将说明这个替代方案,但本教程仍将使用原来的库。 怎样通过 rustup 安装 Rust 如果你访问了 rustup 的官网,它会尝试自动检测你的操作系统,并展示安装 rustup 的最佳方法。一般情况下,你下载并执行一个脚本 — rustup-init,它会帮你完成安装。 然而,如果你下载并执行远程脚本会报错(red flag),你可以点击其他安装选项,直接下载 rustup-init,为你的电脑安装 Rust。 译者注:原文作者放的链接指向了 Rust 的官方 Github,经译者检查没有相应的链接。可以尝试使用该链接下载 rustup-init 。 ...

April 10, 2022 · 2 min · 扬扬得意

【译】hecto:用 Rust 开发自己的文本编辑器

2023.2.1 —— 润色语句,减少翻译腔;增加译者序。 本文翻译自:Hecto: Build your own text editor in Rust – Philipp Flenker – Engineering Manager ,封面图也来自于此。 我们会在这一系列博客中讲解怎样用 Rust 开发文本编辑器。跟这篇非常不错的 kilo 教程讲的差不多,本文的文本编辑器是 kilo 的 Rust 实现。与 kilo 教程类似,本系列文章将逐个步骤地指导你开发一个文本编辑器:hecto。 基本上,你总是可以通过修改、保存和运行程序看到自己的改动。我将尽全力解释执行的每一个步骤 — 有时很详尽,不过大多是链接到其它网页。你可以随意浏览文字,忽略掉这些链接。因为通过运行修改后的代码和观察文本编辑器的变化,就能学到很多东西。 为什么? 我总是这样认为:每个软件工程师需要对至少两种程序设计语言有深入的了解。好吧,我要承认,过去这几年,我开始忘记除 JavaScript 以外的知识了。这也是我开始学 Rust 的原因。我把重新实现 kilo 作为学习过程。但是为什么呢?为了学习 Rust,我希望重新实现一个容易理解的软件,这样就能专注于语言本身,而不用沉溺于实现细节中。但是我又不想重新实现用 JavaScript 实现的东西。因为我认为 JavaScript 是为一个不同于 Rust 的方向而设计的。或者换句话说,如果你是个修水管的,你最好通过砍树来学习如何用斧子,而不是去学习疏通洗碗池。kilo 的难度足以提供一个挑战。当我阅读的时候,我也期望它也可以用 Rust 实现 — 现在它来了! 那为什么起这样一个名字呢?hecto 的目标比 kilo 更谦逊。它的志向并不是小,况且这还不是我自己的主意 — 所以给它起一个比前辈更谦逊的名字似乎合适一些。(译者注:kilo 有千的意思,hecto 表示的是百,所以『小』了。) 许可证明 kilo 在 BSD-2 Clause License 下分发; 原来的教程在 CC BY 4.0 协议下分发; ...

April 9, 2022 · 1 min · 扬扬得意

Python 和 Golang 中的排序操作

假设给定一个二维的整形数组 nums,元素是长度为 2 的数组,如下: [[5,4],[6,4],[6,7],[2,3]] 目前的需求是对该数组排序,要求为将每个元素的第一个数字升序排列,如果该数字相等,则将第二个数字降序排列。 即排序后 nums 如下所示: [[2,3],[5,4],[6,7],[6,4]] 二维的有点麻烦,我们先考虑怎样对一个一维数组进行排序。 比如,我们现在有这样的一个一维数组: [35, 22, 189, 33, -33, 0] 我们怎样对它进行升序排序呢? 先看一下 Python (Python 3 以上版本) 是怎样做的。 nums = [35, 22, 189, 33, -33, 0] # 第一种方式 nums.sort() # 第二种方式 nums = sorted(nums) 从两种方式的不同调用方式可以看出差异:sort() 对原数组(列表)排序,而 sorted() 会返回一个新的数组。除此之外,sort() 只能被数组调用,而 sorted() 可以对任意可迭代对象(比如元组)进行排序。 那如果要降序排序呢? nums = [35, 22, 189, 33, -33, 0] # 第一种方式 nums.sort(reverse=True) # 第二种方式 nums = sorted(nums, reverse=True) 只需要指定 reverse 参数为 True 即可。 那么 Golang 是怎样做的? package main import ( "sort" ) func main() { nums := []int{35, 22, 189, 33, -33, 0} // 升序排序 sort.Ints(nums) // 降序排序 sort.Sort(sort.Reverse(sort.IntSlice(nums))) } 从调用方式上来看,可以看出 Golang 要比 Python 麻烦一些,其中,升序排序很直观。 ...

March 27, 2022 · 3 min · 扬扬得意

对比 Go、Python 和 Rust 三种语言中字符串索引操作

字符串有很多实现细节,如果详细介绍每个细节,一篇文章的篇幅显然是不够的。 这篇文章不会面面俱到地讲述细节,而是聚焦于三种不同的语言对字符串遍历和索引的处理逻辑。 假设我们现在有这样的一个字符串 "Hello, 世界",我们首先在三种语言中做遍历和求字符串长度操作。 # Python st = "Hello, 世界" for item in st: print(item) print(len(st)) # Output: # H # e # l # l # o # , # # 世 # 界 # 9 Python 的操作逻辑符合我们直觉,"Hello, 世界" 一共有 9 个字符。 // Go package main import "fmt" func main() { st := "Hello, 世界" for _, item := range st { fmt.Println(item) } fmt.Println(len(st)) fmt.Println("-----") // 把字符串转换为字节数组 for _, item := range []byte(st) { fmt.Println(item) } } /* Output: 72 101 108 108 111 44 32 19990 30028 13 ----- 72 101 108 108 111 44 32 228 184 150 231 149 140 */ Go 这边和 Python 差距比较大,输出的不是字符而是数字,而且字符串的长度竟然是 13,这是什么情况?首先把问题放到一边,继续看 Rust 的情况。 ...

March 23, 2022 · 2 min · 扬扬得意