新書推薦: 《 
			如果未来可以被编辑 关于基因编辑的技术、哲学和艺术悖论
			》  售價:HK$ 
			64.9
			  
			《 
			数字芯片后端设计基础与实践(微课版)
			》  售價:HK$ 
			65.8
			  
			《 
			AI赋能财务:写给CFO的AI使用手册
			》  售價:HK$ 
			98.8
			  
			《 
			无人机技术 未来趋势与实际应用
			》  售價:HK$ 
			184.8
			  
			《 
			谁在研究中国:海外中国研究中心要览
			》  售價:HK$ 
			88.0
			  
			《 
			小白理财进阶之道:富爸爸的财富花园+财务自由笔记+有钱人穷的时候都在做什么(共3册)
			》  售價:HK$ 
			197.3
			  
			《 
			谎言的逻辑:洞悉谎言背后真实的心理和人性 专享版
			》  售價:HK$ 
			54.8
			  
			《 
			汗青堂丛书022——罗马元老院与人民:一部古罗马史(新版)
			》  售價:HK$ 
			140.8
			  
			 
     
      
      
         
          編輯推薦:  
         
           
            一个基于项目的编写Rust命令行入门指南。
 
         
      
      
      
      
      
         
          內容簡介:  
         
           
            本书介绍了以下内容:使用Rust的标准库和数据类型,如数字、字符串、向量、结构、Options和Results来创建命令行程序。编写和测试Rust程序和函数。读写文件,包括标准输入、标准输出和标准错误。为命令行参数编写文档和校验参数。优雅地处理程序的异常。使用正则表达式和Rust crate,手动解析原始文本或带分隔符的文本。使用和控制随机数。
           
         
      
      
      
      
         
          關於作者:  
         
           
            Ken Youens-Clark是《Tiny Python Projects》(Manning, 2020)和《Mastering Python for Bioinformatics》(OReilly, 2021)的作者。Ken 是一位高级开发人员,拥有25年的多种语言的代码编写和支持经验。他数年来高水平地教授编码技能,并且一直致力于为好学的人创造有价值的教学资源。
           
         
      
      
      
      
      
         
          目錄  
         
           
            目录
 
         
      
      
      
      
         
          內容試閱  
         
           
            前言I already know the ending \\ It ’s the part that makes your face implode—— They Might Be Giants,“Experimental Film” (2004)我记得在1995 年,一种名为“JavaScript”的新语言问世。几年后,我决定学习它。于是我买了一本又大又厚的参考书,从头到尾读了一遍。这本书写得很好,从字符串到列表再到对象,详细地讲解了这种语言。但是当我读完了这本书,我依然无法编写出有用的JavaScript 代码。如果不通过编写程序来运用这些知识,我学到的仅仅是皮毛。从那时起,我改进了学习编程语言的方法,我的方法就是重写我已经写过的程序,比如井字棋游戏。作为一名程序员,这也许是可以培养的最Z有价值的技能。Rust 现在是一门新的语言,也许你是为了了解它而拿起了这本书。不过,这本书并不是传统意义上的参考手册。现在有很多关于Rust 的优秀参考书籍存在。相反,我写这本书的目的是让你使用Rust 编写你熟悉的小程序。Rust 的学习曲线相当陡峭,但我相信这种方法可以帮助你快速熟练掌握它。具体来说,你将使用Rust 编写常用的UNIX 命令行工具,如head 和cal。这将让你更深入了解这些工具及其使用方法,还提供使用Rust 概念(如字符串、向量和文件句柄)的机会。如果你不熟悉UNIX 或命令行编程,那你将要学习到诸如程序退出值、命令行参数、输出重定向、管道等概念,以及如何使用STDERR(标准错误)将错误消息与其他输出隔离。你在编写程序时,将用到Rust 程序开发常用的范式,诸如验证参数、读取和写入文件、解析文本和使用正则表达式等。许多这些工具和概念甚至在Windows 系统上都不存在,因此该平台的用户将有机会编写几个常用的UNIX 命令行工具。Rust 是什么(并且为什么大家都在谈论Rust)Rust(https://www.rust-lang.org)是“一种让每个人都能构建可靠高效软件的语言”。Graydon Hoare 在Mozilla Research 工作期间,于2006 年左右和其他人创造了Rust。Rust 收获了大量的关注和用户,以至于到2010 年Mozilla 赞助了开发工作。2021 Stack Overflow 开发者调查(https://oreil.ly/3rumR)显示,有近80000 名开发者连续六年将Rust 评为“最Z受喜爱”的语言。如图1 所示。该语言在语法上与C 语言类似,因此你会发现诸如for 循环、以分号结尾的语句和表示块结构的花括号之类的东西。关键是,Rust 通过使用借用检查器来保证内存安全,该检查器会监控程序的运行,确保在任何时刻,只有特定的部分可以安全地访问内存的不同区域。同时,这种安全性不会以牺牲性能为代价。Rust 程序编译为二进制文件,并且程序的运行速度通常可以达到或超过用C 或C 编写的程序。因此,Rust 通常被描述为一种专为性能和安全而设计的系统编程语言。Rust 是一种静态类型语言,类似于C/C 或Java。这意味着变量的类型永远不能被改变,例如从数字变为字符串。在Rust 中,你不必总是声明变量的类型,因为编译器通常可以根据上下文推断出类型。这与动态类型语言相反,比如Perl,JavaScript 和Python。在这些语言中,变量的类型可以在程序中的任何位置被更改,例如从字符串变为文件句柄。Rust 不是C 或Java 那样的面向对象(OO)语言,因为Rust 中没有类或继承。相反,Rust 使用struct(结构体)来表示复杂的数据类型,使用特征来描述类型的行为。这些结构体可以有方法,可以改变数据的内部状态,甚至可能在文档中被称为对象,但它们不是正式意义上的对象。Rust 借鉴了许多其他语言和编程范式的概念,包括纯函数式语言,如Haskell。例如,Rust 中的变量默认是不可变的,这意味着它们不能被更改其初始值;你必须明确告知编译器它们是可变的。函数也是一等值,这意味着它们可以作为参数传递给其他所谓的高阶函数。最Z让我感到兴奋的是Rust 对枚举类型和类型(即代数数据类型,Algebraic Data Types,ADTs)的运用。举个例子,它们允许函数可以返回一个Result,它可以是包含某个值的Ok,或包含某种其他类型值的Err。任何处理这些值的代码都必须处理所有可能性,所以你永远不会忘记处理可能导致程序意外崩溃的错误。谁应该读这本书如果你想通过编写一个实用的命令行程序,来学习Rust 语言的基础知识,那么你应该阅读本书。我想大多数读者已经从其他语言了解了一些编程基础知识。例如,你可能知道如何创建变量、使用循环重复操作、创建函数等。我认为Rust 作为学习的第D一门语言可能是很难的,因为它广泛地使用了类型,并且需要了解一些有关计算机内存的细节。我还假设你至少知道如何使用命令行,并且知道一些基本的UNIX 命令,例如创建、删除和更改目录。本书将从实用的角度,向你展示完成任务所需的知识。如果想学习更全面的知识,可以参考以下书籍,例如由Jim Blandy,Jason Orendorff 和Leonora F. S. Tindall(O’Reilly)合著的《Programming Rust, 2nd》,以及Steve Klabnik 和Carol Nichols(No Starch Press)合著的《The Rust Programming Language》。我强烈建议你在阅读本书时,同时阅读以上的一本或两本,以更深入地了解该语言本身。如果你想了解如何编写和运行测试来检查Rust 程序,也应该阅读本书。我主张使用测试,因为它不仅可以验证程序是否正常运行,而且还可以作为一种辅助手段,将大的问题分解为小的、可理解的、可测试的问题。我将演示如何使用我所提供的测试,以及如何使用测试驱动开发(TDD),即先编写测试,再编写能通过测试的代码。我希望本书能够展示出Rust 编译器的严格性与测试相结合可以带来更易于维护和修改的程序。为什么你应该学习Rust学习Rust 的理由有很多。第D一,我发现Rust 的类型检查可以防止我犯很多基本错误。我以前使用过很多动态类型语言,如Perl、Python 和JavaScript,这些语言几乎没有类型检查。我使用Rust 等静态类型语言越多,就越意识到动态类型语言给我增加了更多工作。它们需要我验证程序并编写更多测试。我逐渐觉得Rust 编译器虽然非常严格,但它是我的舞伴,而不是我的敌人。当然,它是一个舞伴,每次你踩到他们的脚趾或错过信号时都会告诉你,但这最Z终会让你成为一个更好的舞者,毕竟这是我们的目标。一般来说,当我编译一个Rust程序时,它通常都能符合我的预期。第二,与不了解Rust 的人共享Rust 程序很容易,他们甚至可以不是开发人员。如果我为同事编写Python 程序,我必须向他们提供Python 源代码,并确保他们拥有正确版本的Python 和执行代码所需的所有模块,以确保程序能运行。相比之下,Rust 程序能直接编译成机器可执行的文件。我可以在我的机器上编写并调试程序,为它运行的目标平台构建可执行文件,最Z后只将程序的副本提供给我的同事。只要他们有正确的平台,他们就不需要安装Rust 并可以直接运行该程序。第三,我经常使用Docker 或Singularity 构建容器来封装工作流。我发现Rust程序的容器尺寸通常比Python 程序的容器尺寸小几个数量级。例如,带有Python 运行时的Docker 容器可能需要几百MB。相比之下,我可以用Rust 二进制文件构建一个只有几十MB 大小的Linux 虚拟机。除非我真的需要Python的某些特定功能,例如机器学习或自然语言处理模块,否则我更喜欢用Rust 编写程序,并使用更小、更精简的容器。第四,我发现Rust 的丰富生态系统极大地提高了我的工作效率。我在crates.io上找到了很多有用的Rust crate(Rust 中对库的称呼),并且Docs.rs 上的文档内容详尽,易于浏览。编码挑战在本书中,你将通过编写完整的程序来学习如何编写和测试Rust 代码。每一章都会向你展示如何从头开始编写程序、添加功能、处理错误消息,以及测试代码的逻辑。我不希望你在上班的公交车上机械地阅读这本书,然后把它放在一边。你将通过找到自己的解决方法学到最Z多的东西。但我相信,即使照着我提供的源代码敲,也会大有裨益。我为本书挑选的问题来自UNIX 命令行的coreutils 工具集(https://oreil.ly/fYV82),因为我估计很多读者已经非常熟悉它们了。我假设你使用过head 和tail 查看文件,来输出文件的前几行或后几行。但你有没有尝试过编写自己的一版程序?其他Rustaceans(https://www.rustaceans.org)(使用Rust 的人)也有同样的想法,因此你可以在互联网上找到很多不同版本的Rust 实现(https://oreil.ly/RmiBN)。此外,这些都是相当小的程序,每个都只涵盖少部分技能。我已经按照依赖关系排列这些项目,因此最Z好按顺序完成各章。我选择这些程序的一个原因是,它们提供了一种基础的标准。虽然UNIX 有很多种版本,也有很多版实现,但它们通常都以同样的方式工作并产生相同的结果。我使用macOS 进行开发,这意味着我主要运行这些程序的BSD(伯克利标准发行版)或GNU(https://www.gnu.org)(GNU 的非UNIX)变体。一般来说,BSD 版本早于GNU 版本,并且选项较少。对于每个挑战程序,我都使用shell 脚本将原始程序的输出重定向到输出文件中。目标是让Rust 程序为相同的输入创建相同的输出。我精心选择了测试用例,包括Windows 上编码的文件,和与Unicode 字符混合的简单ASCII 文本。目的是能测试我的程序能像原始程序一样,正确地处理各种行尾和字符。对于大多数挑战,我会尝试只实现原始程序一部分功能,以避免挑战程序会变得非常复杂。我还选择对一些程序的输出进行一些小的更改,以便更容易教学。这就像跟着录音一起演奏来学习如何演奏乐器。你不必演奏原始版本的每个音符。重要的是学习常见的范式,例如处理参数和读取输入,从而将其应用于你的代码中。尝试用其他语言编写这些程序,这样你就可以看到这些语言的解决方法与Rust 的不同之处。安装Rust 和获取代码首先,你需要安装Rust。Rust 最Z让我喜欢的一点是,使用rustup 工具安装、升级和管理Rust 非常方便。它在Windows 和UNIX 类型的操作系统(OS)上都同样好用,比如Linux 和macOS。你需要按照操作系统的安装说明(https://oreil.ly/camNw)进行操作。如果已经安装了rustup,可能需要运行rustup update 来获取该语言和工具的最Z新版本,因为Rust 大约每六周更新一次。如果想查看文档,可以执行rustup doc。可以使用以下命令检查rustc 编译器的版本:$ rustc --versionrustc 1.56.1 (59eed8a2a 2021-11-01)本书的GitHub 仓库(https://oreil.ly/pfhMC)提供了程序的所有测试、数据和源代码。你可以使用Git 源代码管理工具(https://git-scm.com)(可能需要安装)将其复制到你的计算机。以下命令将在你的计算机上创建一个名为commandlinerust 的新目录,其中包含本书仓库的内容:$ git clone https://github.com/kyclark/command-line-rust.git你不应该在上一步克隆的目录中编写代码。你应该在其他地方为你的项目创建一个单独的目录。我建议你创建自己的Git 仓库来保存将要编写的程序。例如,如果你使用GitHub 并将其命名为rust-solutions,那么你可以使用以下命令克隆你的仓库。请务必将YOUR_GITHUB_ID 替换为你的实际GitHub ID:$ git clone https://github.com/YOUR_GITHUB_ID/rust-solutions.git你在Rust 中遇到的第D一个工具是Cargo(https://oreil.ly/OhYek),它是Rust 的构建工具、包管理器和测试运行器。每章都会指导你使用Cargo 创建一个新项目,建议在你的rust-solutions 目录中执行此操作。从本书的仓库中,将每章的测试目录复制到你的项目目录中,用来测试你的代码。如果你好奇使用Cargo 和Rust 测试代码是什么样,可以运行第1 章的测试。切换到本书的01_hello 目录并使用cargo test 运行测试:$ cd command-line-rust/01_hello/$ cargo test如果一切顺利,你应该会看到一些通过的测试(无特定顺序):running 3 teststest false_not_ok ... oktest true_ok ... oktest runs ... ok我在macOS、Linux、Windows 10/PowerShell 和Ubuntu Linux/Windows Subsystem for Linux(WSL)上测试了所有程序。虽然我喜欢Rust 在Windows 和UNIX 操作系统上的出色表现,但由于操作系统与UNIX 类型系统之间存在一些根本差异,两个程序(findr 和lsr)在Windows 上的运行略有不同。我建议Windows/PowerShell用户也考虑安装WSL,并在该环境中运行程序。本书中的所有代码都使用rustfmt 格式化,这是一个方便的工具,可以让你的代码看起来漂亮且易读。你可以对项目中的所有源代码运行cargo fmt,也可以将其集成到代码编辑器中以按需运行。例如,我更喜欢使用文本编辑器vim,并将其配置为每次保存代码时自动运行rustfmt,这使阅读代码和查找错误变得容易很多。我建议你使用Clippy(https://oreil.ly/XyzTS),一个Rust 代码的linter。linting 会自动检查代码中是否存在常见错误,似乎大多数语言都提供一个或多个linter。rustfmt 和clippy 都应该默认安装,你也可以使用rustup component add clippy 进行安装。接下来,你可以运行cargo clippy 检查源代码并提出建议。clippy 没有输出意味着它没有建议。现在你可以开始写Rust 代码了!排版约定本书采用以下排版约定。斜体(Italic)表示新术语、URL、电子邮件地址、文件名和文件扩展名。等宽字体(Constant Width)表示程序清单,在段落内表示程序元素,例如变量、函数名称、数据库、数据类型、环境变量、语句和关键字。粗体等宽字体(Constant width bold)表示应由用户原封不动输入的命令或其他文本。斜体等宽字体(Constant width italic)表示应该替换成用户提供值的文本,或者由上下文决定的值。使用代码示例补充材料(代码示例、练习等)可在https://oreil.ly/commandlinerust_code 下载。如果你有技术问题或使用代码示例时遇到问题, 请发送电子邮件至bookquestions@oreilly.com。本书旨在帮助你完成工作。一般来说,本书提供的示例代码,你可以在程序和文档中使用它。如果你要复制大量代码,需联系我们获取许可。若仅仅使用本书中几段代码,则不需要获得许可。出售或分发O’Reilly 书籍中的示例则需要获得许可。通过引用本书和引用示例代码来回答问题不需要获得许可。将本书中的大量示例代码合并到你的产品文档中则需要获得许可。我们欢迎但通常不要求注明出处。注明出处通常包括标题、作者、出版商和ISBN。例如:“Command-Line Rust by Ken Youens-Clark (O’Reilly). Copyright2022 Charles Kenneth Youens-Clark, 978-1-098-10943-1”。如果你认为你对代码示例的使用超出了合理使用或上述许可的范围,请随时通过permissions@oreilly.com 与我们联系。O’Reilly 在线学习平台(O’Reilly Online Learning)近40 年来,O’Reilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。公司独有的专家和改革创新者网络通过O’Reilly 书籍、文章以及在线学习平台,分享他们的专业知识和实践经验。O’Reilly 在线学习平台按照您的需要提供实时培训课程、深入学习渠道、交互式编程环境以及来自O’Reilly 和其他200 多家出版商的大量书籍与视频资料。更多信息,请访问网站:https://www.oreilly.com/。联系我们任何有关本书的意见或疑问,请按照以下地址联系出版社。美国:O’Reilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中国:北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)奥莱利技术咨询(北京)有限公司我们为本书提供了一个网页,其中列出了勘误表、示例和任何其他信息。你可以通过https://oreil.ly/commandLineRust 访问此页面。对本书的评论或技术疑问,可以发电子邮件到errata@oreilly.com.cn。欲了解本社图书和课程的新闻和信息,请访问我们的网站http://oreilly.com。我们的Facebook:http://facebook.com/oreilly。我们的Twitter:http://twitter.com/oreillymedia。我们的YouTube:http://youtube.com/oreillymedia。致谢我首先要感谢的是Rust 社区,他们创造了如此令人难以置信的语言和丰富的学习资源。当我刚接触Rust 编程时,我很快就发现,可以先编写一个简单的程序,然后根据编译器的反馈来完善程序。我会盲目地添加或删去& 和* 以及克隆和借用,直到程序编译完成,然后我就会想办法让它变得更好。当我遇到困难时,总是在https://users.rust-lang.org 上寻求帮助。我在Rust 中遇到的每个人,从Twitter 到Reddit,都很友善和乐于助人。我要感谢BSD 和GNU 社区提供的程序和文档,这些程序和文档是每个章节项目的基础。我感谢慷慨的许可证,允许我包含他们程序的部分帮助文档:? https://www.freebsd.org/copyright/freebsd-license? https://creativecommons.org/licenses/by-nd/4.0我还要感谢开发编辑Corbin Collins 和Rita Fernando,以及产品编辑Caitlin Ghegan 和Greg Hyman。我非常感谢技术审阅者Carol Nichols、Brad Fulton、Erik Nordin 和Jeremy Gailor,他们让我保持在正确的方向上,也非常感谢其他抽出时间发表评论的人,包括Joshua Lynch、Andrew Olson、Jasper Zanjani 和William Evans。我还要感谢过去几年的老板,亚利桑那大学的Bonnie Hurwitz博士和关键路径研究所的Amanda Borens,他们容忍我在职业工作中花费时间和精力学习Rust 等新语言。在我的个人生活中,非常感谢我的妻子Lori Kindler 和三个非常有趣的孩子。如果没有他们的爱与支持,我不可能写出这本书。最Z后,我还要感谢我的朋友Brian Castle,他在高中时努力将我的音乐品位从硬式摇滚和前卫摇滚转向另类乐队,如Depeche Mode、The Smiths 和They Might Be Giants,最Z后只有They Might Be Giants 真正流行起来。