377 lines
36 KiB
HTML
377 lines
36 KiB
HTML
|
<!DOCTYPE HTML>
|
|||
|
<html lang="en" class="sidebar-visible no-js light">
|
|||
|
<head>
|
|||
|
<!-- Book generated using mdBook -->
|
|||
|
<meta charset="UTF-8">
|
|||
|
<title>Introduction - The Rust Programming Language</title>
|
|||
|
|
|||
|
|
|||
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
|||
|
<meta name="description" content="">
|
|||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|||
|
<meta name="theme-color" content="#ffffff" />
|
|||
|
|
|||
|
<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 href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">
|
|||
|
<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:500" rel="stylesheet" type="text/css">
|
|||
|
|
|||
|
<!-- Highlight.js Stylesheets -->
|
|||
|
<link rel="stylesheet" href="highlight.css">
|
|||
|
<link rel="stylesheet" href="tomorrow-night.css">
|
|||
|
<link rel="stylesheet" href="ayu-highlight.css">
|
|||
|
|
|||
|
<!-- Custom theme stylesheets -->
|
|||
|
|
|||
|
<link rel="stylesheet" href="ferris.css">
|
|||
|
|
|||
|
<link rel="stylesheet" href="theme/2018-edition.css">
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<!-- Provide site root to javascript -->
|
|||
|
<script type="text/javascript">
|
|||
|
var path_to_root = "";
|
|||
|
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
|
|||
|
</script>
|
|||
|
|
|||
|
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
|||
|
<script type="text/javascript">
|
|||
|
try {
|
|||
|
var theme = localStorage.getItem('mdbook-theme');
|
|||
|
var 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 type="text/javascript">
|
|||
|
var theme;
|
|||
|
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
|||
|
if (theme === null || theme === undefined) { theme = default_theme; }
|
|||
|
var html = document.querySelector('html');
|
|||
|
html.classList.remove('no-js')
|
|||
|
html.classList.remove('light')
|
|||
|
html.classList.add(theme);
|
|||
|
html.classList.add('js');
|
|||
|
</script>
|
|||
|
|
|||
|
<!-- Hide / unhide sidebar before it is displayed -->
|
|||
|
<script type="text/javascript">
|
|||
|
var html = document.querySelector('html');
|
|||
|
var sidebar = 'hidden';
|
|||
|
if (document.body.clientWidth >= 1080) {
|
|||
|
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
|||
|
sidebar = sidebar || 'visible';
|
|||
|
}
|
|||
|
html.classList.remove('sidebar-visible');
|
|||
|
html.classList.add("sidebar-" + sidebar);
|
|||
|
</script>
|
|||
|
|
|||
|
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
|||
|
<div id="sidebar-scrollbox" class="sidebar-scrollbox">
|
|||
|
<ol class="chapter"><li class="expanded affix "><a href="title-page.html">The Rust Programming Language</a></li><li class="expanded affix "><a href="foreword.html">Foreword</a></li><li class="expanded affix "><a href="ch00-00-introduction.html" class="active">Introduction</a></li><li class="expanded "><a href="ch01-00-getting-started.html"><strong aria-hidden="true">1.</strong> Getting Started</a></li><li><ol class="section"><li class="expanded "><a href="ch01-01-installation.html"><strong aria-hidden="true">1.1.</strong> Installation</a></li><li class="expanded "><a href="ch01-02-hello-world.html"><strong aria-hidden="true">1.2.</strong> Hello, World!</a></li><li class="expanded "><a href="ch01-03-hello-cargo.html"><strong aria-hidden="true">1.3.</strong> Hello, Cargo!</a></li></ol></li><li class="expanded "><a href="ch02-00-guessing-game-tutorial.html"><strong aria-hidden="true">2.</strong> Programming a Guessing Game</a></li><li class="expanded "><a href="ch03-00-common-programming-concepts.html"><strong aria-hidden="true">3.</strong> Common Programming Concepts</a></li><li><ol class="section"><li class="expanded "><a href="ch03-01-variables-and-mutability.html"><strong aria-hidden="true">3.1.</strong> Variables and Mutability</a></li><li class="expanded "><a href="ch03-02-data-types.html"><strong aria-hidden="true">3.2.</strong> Data Types</a></li><li class="expanded "><a href="ch03-03-how-functions-work.html"><strong aria-hidden="true">3.3.</strong> Functions</a></li><li class="expanded "><a href="ch03-04-comments.html"><strong aria-hidden="true">3.4.</strong> Comments</a></li><li class="expanded "><a href="ch03-05-control-flow.html"><strong aria-hidden="true">3.5.</strong> Control Flow</a></li></ol></li><li class="expanded "><a href="ch04-00-understanding-ownership.html"><strong aria-hidden="true">4.</strong> Understanding Ownership</a></li><li><ol class="section"><li class="expanded "><a href="ch04-01-what-is-ownership.html"><strong aria-hidden="true">4.1.</strong> What is Ownership?</a></li><li class="expanded "><a href="ch04-02-references-and-borrowing.html"><strong aria-hidden="true">4.2.</strong> References and Borrowing</a></li><li class="expanded "><a href="ch04-03-slices.html"><strong aria-hidden="true">4.3.</strong> The Slice Type</a></li></ol></li><li class="expanded "><a href="ch05-00-structs.html"><strong aria-hidden="true">5.</strong> Using Structs to Structure Related Data</a></li><li><ol class="section"><li class="expanded "><a href="ch05-01-defining-structs.html"><strong aria-hidden="true">5.1.</strong> Defining and Instantiating Structs</a></li><li class="expanded "><a href="ch05-02-example-structs.html"><strong aria-hidden="true">5.2.</strong> An Example Program Using Structs</a></li><li class="expanded "><a href="ch05-03-method-syntax.html"><strong aria-hidden="true">5.3.</strong> Method Syntax</a></li></ol></li><li class="expanded "><a href="ch06-00-enums.html"><strong aria-hidden="true">6.</strong> Enums and Pattern Matching</a></li><li><ol class="section"><li class="expanded "><a href="ch06-01-defining-an-enum.html"><strong aria-hidden="true">6.1.</strong> Defining an Enum</a></li><li class="expanded "><a href="ch06-02-match.html"><strong aria-hidden="true">6.2.</strong> The match Control Flow Operator</a></li><li class="expanded "><a href="ch06-03-if-let.html"><strong aria-hidden="true">6.3.</strong> Concise Control Flow with if let</a></li></ol></li><li class="expanded "><a href="ch07-00-managing-growing-projects-with-packages-crates-and-modules.html"><strong aria-hidden="true">7.</strong> Managing Growing Projects with Packages, Crates, and Modules</a></li><li><ol class="section"><li class="expanded "><a href="ch07-01-packages-and-crates.html"><strong aria-hidden="true">7.1.</strong> Packages and Crates</a></li><li class="expanded "><a href="ch07-02-defining-modules-to-control-scope-and-privacy.html"><strong aria-hidden="true">7.2.</strong> Defining Modules to Control Scope and Privacy</a></li><li class="expanded "><a href="ch07-03-paths-for-referring-to-an-item-in-the-modu
|
|||
|
</div>
|
|||
|
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
|
|||
|
</nav>
|
|||
|
|
|||
|
<div id="page-wrapper" class="page-wrapper">
|
|||
|
|
|||
|
<div class="page">
|
|||
|
|
|||
|
<div id="menu-bar" class="menu-bar">
|
|||
|
<div id="menu-bar-sticky-container">
|
|||
|
<div class="left-buttons">
|
|||
|
<button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
|||
|
<i class="fa fa-bars"></i>
|
|||
|
</button>
|
|||
|
<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="light">Light (default)</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">The Rust Programming Language</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>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
<div id="search-wrapper" class="hidden">
|
|||
|
<form id="searchbar-outer" class="searchbar-outer">
|
|||
|
<input type="search" name="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 type="text/javascript">
|
|||
|
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>
|
|||
|
<h1><a class="header" href="#introduction" id="introduction">Introduction</a></h1>
|
|||
|
<blockquote>
|
|||
|
<p>Note: This edition of the book is the same as <a href="https://nostarch.com/rust">The Rust Programming
|
|||
|
Language</a> available in print and ebook format from <a href="https://nostarch.com/">No Starch
|
|||
|
Press</a>.</p>
|
|||
|
</blockquote>
|
|||
|
<p>Welcome to <em>The Rust Programming Language</em>, an introductory book about Rust.
|
|||
|
The Rust programming language helps you write faster, more reliable software.
|
|||
|
High-level ergonomics and low-level control are often at odds in programming
|
|||
|
language design; Rust challenges that conflict. Through balancing powerful
|
|||
|
technical capacity and a great developer experience, Rust gives you the option
|
|||
|
to control low-level details (such as memory usage) without all the hassle
|
|||
|
traditionally associated with such control.</p>
|
|||
|
<h2><a class="header" href="#who-rust-is-for" id="who-rust-is-for">Who Rust Is For</a></h2>
|
|||
|
<p>Rust is ideal for many people for a variety of reasons. Let’s look at a few of
|
|||
|
the most important groups.</p>
|
|||
|
<h3><a class="header" href="#teams-of-developers" id="teams-of-developers">Teams of Developers</a></h3>
|
|||
|
<p>Rust is proving to be a productive tool for collaborating among large teams of
|
|||
|
developers with varying levels of systems programming knowledge. Low-level code
|
|||
|
is prone to a variety of subtle bugs, which in most other languages can be
|
|||
|
caught only through extensive testing and careful code review by experienced
|
|||
|
developers. In Rust, the compiler plays a gatekeeper role by refusing to
|
|||
|
compile code with these elusive bugs, including concurrency bugs. By working
|
|||
|
alongside the compiler, the team can spend their time focusing on the program’s
|
|||
|
logic rather than chasing down bugs.</p>
|
|||
|
<p>Rust also brings contemporary developer tools to the systems programming world:</p>
|
|||
|
<ul>
|
|||
|
<li>Cargo, the included dependency manager and build tool, makes adding,
|
|||
|
compiling, and managing dependencies painless and consistent across the Rust
|
|||
|
ecosystem.</li>
|
|||
|
<li>Rustfmt ensures a consistent coding style across developers.</li>
|
|||
|
<li>The Rust Language Server powers Integrated Development Environment (IDE)
|
|||
|
integration for code completion and inline error messages.</li>
|
|||
|
</ul>
|
|||
|
<p>By using these and other tools in the Rust ecosystem, developers can be
|
|||
|
productive while writing systems-level code.</p>
|
|||
|
<h3><a class="header" href="#students" id="students">Students</a></h3>
|
|||
|
<p>Rust is for students and those who are interested in learning about systems
|
|||
|
concepts. Using Rust, many people have learned about topics like operating
|
|||
|
systems development. The community is very welcoming and happy to answer
|
|||
|
student questions. Through efforts such as this book, the Rust teams want to
|
|||
|
make systems concepts more accessible to more people, especially those new to
|
|||
|
programming.</p>
|
|||
|
<h3><a class="header" href="#companies" id="companies">Companies</a></h3>
|
|||
|
<p>Hundreds of companies, large and small, use Rust in production for a variety of
|
|||
|
tasks. Those tasks include command line tools, web services, DevOps tooling,
|
|||
|
embedded devices, audio and video analysis and transcoding, cryptocurrencies,
|
|||
|
bioinformatics, search engines, Internet of Things applications, machine
|
|||
|
learning, and even major parts of the Firefox web browser.</p>
|
|||
|
<h3><a class="header" href="#open-source-developers" id="open-source-developers">Open Source Developers</a></h3>
|
|||
|
<p>Rust is for people who want to build the Rust programming language, community,
|
|||
|
developer tools, and libraries. We’d love to have you contribute to the Rust
|
|||
|
language.</p>
|
|||
|
<h3><a class="header" href="#people-who-value-speed-and-stability" id="people-who-value-speed-and-stability">People Who Value Speed and Stability</a></h3>
|
|||
|
<p>Rust is for people who crave speed and stability in a language. By speed, we
|
|||
|
mean the speed of the programs that you can create with Rust and the speed at
|
|||
|
which Rust lets you write them. The Rust compiler’s checks ensure stability
|
|||
|
through feature additions and refactoring. This is in contrast to the brittle
|
|||
|
legacy code in languages without these checks, which developers are often
|
|||
|
afraid to modify. By striving for zero-cost abstractions, higher-level features
|
|||
|
that compile to lower-level code as fast as code written manually, Rust
|
|||
|
endeavors to make safe code be fast code as well.</p>
|
|||
|
<p>The Rust language hopes to support many other users as well; those mentioned
|
|||
|
here are merely some of the biggest stakeholders. Overall, Rust’s greatest
|
|||
|
ambition is to eliminate the trade-offs that programmers have accepted for
|
|||
|
decades by providing safety <em>and</em> productivity, speed <em>and</em> ergonomics. Give
|
|||
|
Rust a try and see if its choices work for you.</p>
|
|||
|
<h2><a class="header" href="#who-this-book-is-for" id="who-this-book-is-for">Who This Book Is For</a></h2>
|
|||
|
<p>This book assumes that you’ve written code in another programming language but
|
|||
|
doesn’t make any assumptions about which one. We’ve tried to make the material
|
|||
|
broadly accessible to those from a wide variety of programming backgrounds. We
|
|||
|
don’t spend a lot of time talking about what programming <em>is</em> or how to think
|
|||
|
about it. If you’re entirely new to programming, you would be better served by
|
|||
|
reading a book that specifically provides an introduction to programming.</p>
|
|||
|
<h2><a class="header" href="#how-to-use-this-book" id="how-to-use-this-book">How to Use This Book</a></h2>
|
|||
|
<p>In general, this book assumes that you’re reading it in sequence from front to
|
|||
|
back. Later chapters build on concepts in earlier chapters, and earlier
|
|||
|
chapters might not delve into details on a topic; we typically revisit the
|
|||
|
topic in a later chapter.</p>
|
|||
|
<p>You’ll find two kinds of chapters in this book: concept chapters and project
|
|||
|
chapters. In concept chapters, you’ll learn about an aspect of Rust. In project
|
|||
|
chapters, we’ll build small programs together, applying what you’ve learned so
|
|||
|
far. Chapters 2, 12, and 20 are project chapters; the rest are concept chapters.</p>
|
|||
|
<p>Chapter 1 explains how to install Rust, how to write a “Hello, world!” program,
|
|||
|
and how to use Cargo, Rust’s package manager and build tool. Chapter 2 is a
|
|||
|
hands-on introduction to the Rust language. Here we cover concepts at a high
|
|||
|
level, and later chapters will provide additional detail. If you want to get
|
|||
|
your hands dirty right away, Chapter 2 is the place for that. At first, you
|
|||
|
might even want to skip Chapter 3, which covers Rust features similar to those
|
|||
|
of other programming languages, and head straight to Chapter 4 to learn about
|
|||
|
Rust’s ownership system. However, if you’re a particularly meticulous learner
|
|||
|
who prefers to learn every detail before moving on to the next, you might want
|
|||
|
to skip Chapter 2 and go straight to Chapter 3, returning to Chapter 2 when
|
|||
|
you’d like to work on a project applying the details you’ve learned.</p>
|
|||
|
<p>Chapter 5 discusses structs and methods, and Chapter 6 covers enums, <code>match</code>
|
|||
|
expressions, and the <code>if let</code> control flow construct. You’ll use structs and
|
|||
|
enums to make custom types in Rust.</p>
|
|||
|
<p>In Chapter 7, you’ll learn about Rust’s module system and about privacy rules
|
|||
|
for organizing your code and its public Application Programming Interface
|
|||
|
(API). Chapter 8 discusses some common collection data structures that the
|
|||
|
standard library provides, such as vectors, strings, and hash maps. Chapter 9
|
|||
|
explores Rust’s error-handling philosophy and techniques.</p>
|
|||
|
<p>Chapter 10 digs into generics, traits, and lifetimes, which give you the power
|
|||
|
to define code that applies to multiple types. Chapter 11 is all about testing,
|
|||
|
which even with Rust’s safety guarantees is necessary to ensure your program’s
|
|||
|
logic is correct. In Chapter 12, we’ll build our own implementation of a subset
|
|||
|
of functionality from the <code>grep</code> command line tool that searches for text
|
|||
|
within files. For this, we’ll use many of the concepts we discussed in the
|
|||
|
previous chapters.</p>
|
|||
|
<p>Chapter 13 explores closures and iterators: features of Rust that come from
|
|||
|
functional programming languages. In Chapter 14, we’ll examine Cargo in more
|
|||
|
depth and talk about best practices for sharing your libraries with others.
|
|||
|
Chapter 15 discusses smart pointers that the standard library provides and the
|
|||
|
traits that enable their functionality.</p>
|
|||
|
<p>In Chapter 16, we’ll walk through different models of concurrent programming
|
|||
|
and talk about how Rust helps you to program in multiple threads fearlessly.
|
|||
|
Chapter 17 looks at how Rust idioms compare to object-oriented programming
|
|||
|
principles you might be familiar with.</p>
|
|||
|
<p>Chapter 18 is a reference on patterns and pattern matching, which are powerful
|
|||
|
ways of expressing ideas throughout Rust programs. Chapter 19 contains a
|
|||
|
smorgasbord of advanced topics of interest, including unsafe Rust, macros, and
|
|||
|
more about lifetimes, traits, types, functions, and closures.</p>
|
|||
|
<p>In Chapter 20, we’ll complete a project in which we’ll implement a low-level
|
|||
|
multithreaded web server!</p>
|
|||
|
<p>Finally, some appendixes contain useful information about the language in a
|
|||
|
more reference-like format. Appendix A covers Rust’s keywords, Appendix B
|
|||
|
covers Rust’s operators and symbols, Appendix C covers derivable traits
|
|||
|
provided by the standard library, Appendix D covers some useful development
|
|||
|
tools, and Appendix E explains Rust editions.</p>
|
|||
|
<p>There is no wrong way to read this book: if you want to skip ahead, go for it!
|
|||
|
You might have to jump back to earlier chapters if you experience any
|
|||
|
confusion. But do whatever works for you.</p>
|
|||
|
<p><span id="ferris"></span></p>
|
|||
|
<p>An important part of the process of learning Rust is learning how to read the
|
|||
|
error messages the compiler displays: these will guide you toward working code.
|
|||
|
As such, we’ll provide many examples that don’t compile along with the error
|
|||
|
message the compiler will show you in each situation. Know that if you enter
|
|||
|
and run a random example, it may not compile! Make sure you read the
|
|||
|
surrounding text to see whether the example you’re trying to run is meant to
|
|||
|
error. Ferris will also help you distinguish code that isn’t meant to work:</p>
|
|||
|
<table><thead><tr><th>Ferris</th><th>Meaning</th></tr></thead><tbody>
|
|||
|
<tr><td><img src="img/ferris/does_not_compile.svg" class="ferris-explain"/></td><td>This code does not compile!</td></tr>
|
|||
|
<tr><td><img src="img/ferris/panics.svg" class="ferris-explain"/></td><td>This code panics!</td></tr>
|
|||
|
<tr><td><img src="img/ferris/unsafe.svg" class="ferris-explain"/></td><td>This code block contains unsafe code.</td></tr>
|
|||
|
<tr><td><img src="img/ferris/not_desired_behavior.svg" class="ferris-explain"/></td><td>This code does not produce the desired behavior.</td></tr>
|
|||
|
</tbody></table>
|
|||
|
<p>In most situations, we’ll lead you to the correct version of any code that
|
|||
|
doesn’t compile.</p>
|
|||
|
<h2><a class="header" href="#source-code" id="source-code">Source Code</a></h2>
|
|||
|
<p>The source files from which this book is generated can be found on
|
|||
|
<a href="https://github.com/rust-lang/book/tree/master/src">GitHub</a>.</p>
|
|||
|
|
|||
|
</main>
|
|||
|
|
|||
|
<nav class="nav-wrapper" aria-label="Page navigation">
|
|||
|
<!-- Mobile navigation buttons -->
|
|||
|
|
|||
|
<a rel="prev" href="foreword.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" href="ch01-00-getting-started.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 href="foreword.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
|||
|
<i class="fa fa-angle-left"></i>
|
|||
|
</a>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<a href="ch01-00-getting-started.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 type="text/javascript">
|
|||
|
window.playpen_copyable = true;
|
|||
|
</script>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
<script src="mark.min.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
<script src="searcher.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
|
|||
|
|
|||
|
<script src="clipboard.min.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
<script src="highlight.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
<script src="book.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
|
|||
|
<!-- Custom JS scripts -->
|
|||
|
|
|||
|
<script type="text/javascript" src="ferris.js"></script>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</body>
|
|||
|
</html>
|