You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
trpl-zh-cn/appendix-04-useful-developm...

305 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE HTML>
<html lang="en" class="light sidebar-visible" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>D - 实用开发工具 - Rust 程序设计语言 简体中文版</title>
<!-- Custom HTML head -->
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="favicon.svg">
<link rel="shortcut icon" href="favicon.png">
<link rel="stylesheet" href="css/variables.css">
<link rel="stylesheet" href="css/general.css">
<link rel="stylesheet" href="css/chrome.css">
<link rel="stylesheet" href="css/print.css" media="print">
<!-- Fonts -->
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
<link rel="stylesheet" href="fonts/fonts.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" id="highlight-css" href="highlight.css">
<link rel="stylesheet" id="tomorrow-night-css" href="tomorrow-night.css">
<link rel="stylesheet" id="ayu-highlight-css" href="ayu-highlight.css">
<!-- Custom theme stylesheets -->
<link rel="stylesheet" href="ferris.css">
<link rel="stylesheet" href="theme/2018-edition.css">
<link rel="stylesheet" href="theme/semantic-notes.css">
<link rel="stylesheet" href="theme/listing.css">
<!-- Provide site root and default themes to javascript -->
<script>
const path_to_root = "";
const default_light_theme = "light";
const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="toc.js"></script>
</head>
<body>
<div id="body-container">
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
let theme = localStorage.getItem('mdbook-theme');
let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
html.classList.remove('light')
html.classList.add(theme);
html.classList.add("js");
</script>
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
<!-- Hide / unhide sidebar before it is displayed -->
<script>
let sidebar = null;
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
}
sidebar_toggle.checked = sidebar === 'visible';
html.classList.remove('sidebar-visible');
html.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<!-- populated by js -->
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
<noscript>
<iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
</noscript>
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
<div class="sidebar-resize-indicator"></div>
</div>
</nav>
<div id="page-wrapper" class="page-wrapper">
<div class="page">
<div id="menu-bar-hover-placeholder"></div>
<div id="menu-bar" class="menu-bar sticky">
<div class="left-buttons">
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</label>
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
<i class="fa fa-paint-brush"></i>
</button>
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
</ul>
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
<i class="fa fa-search"></i>
</button>
</div>
<h1 class="menu-title">Rust 程序设计语言 简体中文版</h1>
<div class="right-buttons">
<a href="print.html" title="Print this book" aria-label="Print this book">
<i id="print-button" class="fa fa-print"></i>
</a>
<a href="https://github.com/KaiserY/trpl-zh-cn/tree/main" title="Git repository" aria-label="Git repository">
<i id="git-repository-button" class="fa fa-github"></i>
</a>
<a href="https://github.com/KaiserY/trpl-zh-cn/edit/main/src/appendix-04-useful-development-tools.md" title="Suggest an edit" aria-label="Suggest an edit">
<i id="git-edit-button" class="fa fa-edit"></i>
</a>
</div>
</div>
<div id="search-wrapper" class="hidden">
<form id="searchbar-outer" class="searchbar-outer">
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
</form>
<div id="searchresults-outer" class="searchresults-outer hidden">
<div id="searchresults-header" class="searchresults-header"></div>
<ul id="searchresults">
</ul>
</div>
</div>
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
<script>
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
</script>
<div id="content" class="content">
<main>
<h2 id="附录-d实用开发工具"><a class="header" href="#附录-d实用开发工具">附录 D实用开发工具</a></h2>
<!-- https://github.com/rust-lang/book/blob/main/src/appendix-04-useful-development-tools.md -->
<!-- commit 56ec353290429e6547109e88afea4de027b0f1a9 -->
<p>在本附录中,我们将讨论 Rust 项目提供的一些有助于开发 Rust 代码的工具。我们将介绍自动格式化、快速应用警告修复、linter 以及与 IDE 的集成。</p>
<h3 id="通过-rustfmt-自动格式化"><a class="header" href="#通过-rustfmt-自动格式化">通过 <code>rustfmt</code> 自动格式化</a></h3>
<p><code>rustfmt</code> 工具根据社区代码风格格式化代码。很多项目使用 <code>rustfmt</code> 来避免编写 Rust 代码风格的争论:所有人都用这个工具格式化代码!</p>
<p>安装 <code>rustfmt</code></p>
<p>Rust 安装默认已包含 rustfmt因此你的系统上应该已经有 <code>rustfmt</code><code>cargo-fmt</code> 程序了。这两个命令类似于 <code>rustc</code><code>cargo</code>,其中 <code>rustfmt</code> 提供了更细粒度的控制,而 <code>cargo-fmt</code> 则理解使用 Cargo 的项目约定。要格式化任何 Cargo 项目,请输入以下命令:</p>
<pre><code class="language-sh">$ cargo fmt
</code></pre>
<p>运行此命令会格式化当前 crate 中所有的 Rust 代码。这应该只会改变代码风格,而不是代码语义。</p>
<p>该命令会为你提供 <code>rustfmt</code><code>cargo-fmt</code>,类似于 Rust 同时提供 <code>rustc</code><code>cargo</code>。要格式化任何 Cargo 项目,请执行以下命令:</p>
<pre><code class="language-console">$ cargo fmt
</code></pre>
<p>运行此命令会格式化当前 crate 中所有的 Rust 代码。这应该只会改变代码风格,而不是代码语义。有关 <code>rustfmt</code> 的更多信息,请参阅 <a href="https://github.com/rust-lang/rustfmt">该文档</a></p>
<h3 id="通过-rustfix-修复代码"><a class="header" href="#通过-rustfix-修复代码">通过 <code>rustfix</code> 修复代码</a></h3>
<p><code>rustfix</code> 工具已随 Rust 安装一并提供,可以自动修复那些具有明确修复方式的编译器警告,这通常正是你所需要的。你可能已经见过类似的编译器警告。例如,考虑如下代码:</p>
<p><span class="filename">文件名src/main.rs</span></p>
<pre><pre class="playground"><code class="language-rust edition2021">fn main() {
let mut x = 42;
println!("{x}");
}</code></pre></pre>
<p>这里定义变量 <code>x</code> 为可变但是我们从未修改它。Rust 会警告说:</p>
<p>这里调用了 <code>do_something</code> 函数 100 次,不过从未在 <code>for</code> 循环体中使用变量 <code>i</code>。Rust 会警告说:</p>
<pre><code class="language-console">$ cargo build
Compiling myprogram v0.1.0 (file:///projects/myprogram)
warning: variable does not need to be mutable
--&gt; src/main.rs:2:9
|
2 | let mut x = 0;
| ----^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
</code></pre>
<p>警告中建议移除 <code>mut</code> 关键字。我们可以通过运行 <code>cargo fix</code> 命令使用 <code>rustfix</code> 工具来自动采用该建议:</p>
<pre><code class="language-console">$ cargo fix
Checking myprogram v0.1.0 (file:///projects/myprogram)
Fixing src/main.rs (1 fix)
Finished dev [unoptimized + debuginfo] target(s) in 0.59s
</code></pre>
<p>如果再次查看 <em>src/main.rs</em>,会发现 <code>cargo fix</code> 修改了代码:</p>
<p><span class="filename">文件名src/main.rs</span></p>
<pre><pre class="playground"><code class="language-rust edition2021">fn main() {
let x = 42;
println!("{x}");
}</code></pre></pre>
<p>变量 <code>x</code> 现在是不可变的了,警告也不再出现。</p>
<p><code>cargo fix</code> 命令可以用于在不同 Rust 版本间迁移代码。版本在<a href="appendix-05-editions.html">附录 E</a>中介绍。</p>
<h3 id="使用-clippy-获取更多-lint"><a class="header" href="#使用-clippy-获取更多-lint">使用 Clippy 获取更多 lint</a></h3>
<p>Clippy 工具是一组 lints 的集合,用于分析你的代码,帮助你捕捉常见错误并改进 Rust 代码。Clippy 已包含在 Rust 的标准安装中。</p>
<p>要对任何 Cargo 项目运行 Clippy 的 lint请输入以下命令</p>
<pre><code class="language-console">$ cargo clippy
</code></pre>
<p>例如,你编写了一个程序使用了数学常数,例如 pi的一个近似值如下所示</p>
<p><span class="filename">文件名src/main.rs</span></p>
<pre><pre class="playground"><code class="language-rust edition2021">fn main() {
let x = 3.1415;
let r = 8.0;
println!("the area of the circle is {}", x * r * r);
}</code></pre></pre>
<p>在此项目上运行 <code>cargo clippy</code> 会导致这个错误:</p>
<pre><code class="language-text">error: approximate value of `f{32, 64}::consts::PI` found
--&gt; src/main.rs:2:13
|
2 | let x = 3.1415;
| ^^^^^^
|
= note: `#[deny(clippy::approx_constant)]` on by default
= help: consider using the constant directly
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant
</code></pre>
<p>该错误提示你 Rust 已经定义了一个更精确的 <code>PI</code> 常量,如果使用该常量,你的程序会更为正确。你可以将代码改为使用 <code>PI</code> 常量。如下代码就不会引发 Clippy 的任何错误或警告:</p>
<p><span class="filename">文件名src/main.rs</span></p>
<pre><pre class="playground"><code class="language-rust edition2021">fn main() {
let x = std::f64::consts::PI;
let r = 8.0;
println!("the area of the circle is {}", x * r * r);
}</code></pre></pre>
<p>有关 Clippy 的更多信息,请参阅 <a href="https://github.com/rust-lang/rust-clippy">其文档</a></p>
<h3 id="使用-rust-analyzer-的-ide-集成"><a class="header" href="#使用-rust-analyzer-的-ide-集成">使用 <code>rust-analyzer</code> 的 IDE 集成</a></h3>
<p>为了帮助 IDE 集成Rust 社区建议使用 <a href="https://rust-analyzer.github.io"><code>rust-analyzer</code></a>。这个工具是一组以编译器为中心的实用程序,它实现了 <a href="http://langserver.org/">Language Server Protocol</a>,一个 IDE 与编程语言之间的通信规范。<code>rust-analyzer</code> 可以用于不同的客户端,比如 <a href="https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer">Visual Studio Code 的 Rust analyzer 插件</a></p>
<p>访问 <code>rust-analyzer</code> 项目的<a href="https://rust-analyzer.github.io">主页</a>来了解如何安装它,然后为你的 IDE 安装 language server 支持。如此你的 IDE 便会获得如自动补全、跳转到定义和 inline error 之类的功能。</p>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="appendix-03-derivable-traits.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next prefetch" href="appendix-05-editions.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
<div style="clear: both"></div>
</nav>
</div>
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a rel="prev" href="appendix-03-derivable-traits.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next prefetch" href="appendix-05-editions.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav>
</div>
<script>
window.playground_copyable = true;
</script>
<script src="elasticlunr.min.js"></script>
<script src="mark.min.js"></script>
<script src="searcher.js"></script>
<script src="clipboard.min.js"></script>
<script src="highlight.js"></script>
<script src="book.js"></script>
<!-- Custom JS scripts -->
<script src="ferris.js"></script>
</div>
</body>
</html>