<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title>All the Places Patterns May be Used - 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"> <base href=""> <link rel="stylesheet" href="book.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 rel="shortcut icon" href="favicon.png"> <!-- Font Awesome --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> <link rel="stylesheet" href="highlight.css"> <link rel="stylesheet" href="tomorrow-night.css"> <style> .page-wrapper.has-warning > .nav-chapters { /* add height for warning content & margin */ top: 120px; } p.warning { background-color: rgb(242, 222, 222); border-bottom-color: rgb(238, 211, 215); border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-bottom-style: solid; border-bottom-width: 0.666667px; border-image-outset: 0 0 0 0; border-image-repeat: stretch stretch; border-image-slice: 100% 100% 100% 100%; border-image-source: none; border-image-width: 1 1 1 1; border-left-color: rgb(238, 211, 215); border-left-style: solid; border-left-width: 0.666667px; border-right-color: rgb(238, 211, 215); border-right-style: solid; border-right-width: 0.666667px; border-top-color: rgb(238, 211, 215); border-top-left-radius: 4px; border-top-right-radius: 4px; border-top-style: solid; border-top-width: 0.666667px; color: rgb(185, 74, 72); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 30px; padding-bottom: 8px; padding-left: 14px; padding-right: 35px; padding-top: 8px; } p.warning strong { color: rgb(185, 74, 72) } p.warning a { color: rgb(0, 136, 204) } </style> <!-- MathJax --> <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <!-- Fetch JQuery from CDN but have a local fallback --> <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> <script> if (typeof jQuery == 'undefined') { document.write(unescape("%3Cscript src='jquery.js'%3E%3C/script%3E")); } </script> </head> <body class="light"> <!-- Set the theme before any content is loaded, prevents flash --> <script type="text/javascript"> var theme = localStorage.getItem('theme'); if (theme == null) { theme = 'light'; } $('body').removeClass().addClass(theme); </script> <!-- Hide / unhide sidebar before it is displayed --> <script type="text/javascript"> var sidebar = localStorage.getItem('sidebar'); if (sidebar === "hidden") { $("html").addClass("sidebar-hidden") } else if (sidebar === "visible") { $("html").addClass("sidebar-visible") } </script> <div id="sidebar" class="sidebar"> <ul class="chapter"><li><a href="ch01-00-introduction.html"><strong>1.</strong> Introduction</a></li><li><ul class="section"><li><a href="ch01-01-installation.html"><strong>1.1.</strong> Installation</a></li><li><a href="ch01-02-hello-world.html"><strong>1.2.</strong> Hello, World!</a></li></ul></li><li><a href="ch02-00-guessing-game-tutorial.html"><strong>2.</strong> Guessing Game Tutorial</a></li><li><a href="ch03-00-common-programming-concepts.html"><strong>3.</strong> Common Programming Concepts</a></li><li><ul class="section"><li><a href="ch03-01-variables-and-mutability.html"><strong>3.1.</strong> Variables and Mutability</a></li><li><a href="ch03-02-data-types.html"><strong>3.2.</strong> Data Types</a></li><li><a href="ch03-03-how-functions-work.html"><strong>3.3.</strong> How Functions Work</a></li><li><a href="ch03-04-comments.html"><strong>3.4.</strong> Comments</a></li><li><a href="ch03-05-control-flow.html"><strong>3.5.</strong> Control Flow</a></li></ul></li><li><a href="ch04-00-understanding-ownership.html"><strong>4.</strong> Understanding Ownership</a></li><li><ul class="section"><li><a href="ch04-01-what-is-ownership.html"><strong>4.1.</strong> What is Ownership?</a></li><li><a href="ch04-02-references-and-borrowing.html"><strong>4.2.</strong> References & Borrowing</a></li><li><a href="ch04-03-slices.html"><strong>4.3.</strong> Slices</a></li></ul></li><li><a href="ch05-00-structs.html"><strong>5.</strong> Using Structs to Structure Related Data</a></li><li><ul class="section"><li><a href="ch05-01-defining-structs.html"><strong>5.1.</strong> Defining and Instantiating Structs</a></li><li><a href="ch05-02-example-structs.html"><strong>5.2.</strong> An Example Program Using Structs</a></li><li><a href="ch05-03-method-syntax.html"><strong>5.3.</strong> Method Syntax</a></li></ul></li><li><a href="ch06-00-enums.html"><strong>6.</strong> Enums and Pattern Matching</a></li><li><ul class="section"><li><a href="ch06-01-defining-an-enum.html"><strong>6.1.</strong> Defining an Enum</a></li><li><a href="ch06-02-match.html"><strong>6.2.</strong> The <code>match</code> Control Flow Operator</a></li><li><a href="ch06-03-if-let.html"><strong>6.3.</strong> Concise Control Flow with <code>if let</code></a></li></ul></li><li><a href="ch07-00-modules.html"><strong>7.</strong> Modules</a></li><li><ul class="section"><li><a href="ch07-01-mod-and-the-filesystem.html"><strong>7.1.</strong> <code>mod</code> and the Filesystem</a></li><li><a href="ch07-02-controlling-visibility-with-pub.html"><strong>7.2.</strong> Controlling Visibility with <code>pub</code></a></li><li><a href="ch07-03-importing-names-with-use.html"><strong>7.3.</strong> Importing Names with <code>use</code></a></li></ul></li><li><a href="ch08-00-common-collections.html"><strong>8.</strong> Common Collections</a></li><li><ul class="section"><li><a href="ch08-01-vectors.html"><strong>8.1.</strong> Vectors</a></li><li><a href="ch08-02-strings.html"><strong>8.2.</strong> Strings</a></li><li><a href="ch08-03-hash-maps.html"><strong>8.3.</strong> Hash Maps</a></li></ul></li><li><a href="ch09-00-error-handling.html"><strong>9.</strong> Error Handling</a></li><li><ul class="section"><li><a href="ch09-01-unrecoverable-errors-with-panic.html"><strong>9.1.</strong> Unrecoverable Errors with <code>panic!</code></a></li><li><a href="ch09-02-recoverable-errors-with-result.html"><strong>9.2.</strong> Recoverable Errors with <code>Result</code></a></li><li><a href="ch09-03-to-panic-or-not-to-panic.html"><strong>9.3.</strong> To <code>panic!</code> or Not To <code>panic!</code></a></li></ul></li><li><a href="ch10-00-generics.html"><strong>10.</strong> Generic Types, Traits, and Lifetimes</a></li><li><ul class="section"><li><a href="ch10-01-syntax.html"><strong>10.1.</strong> Generic Data Types</a></li><li><a href="ch10-02-traits.html"><strong>10.2.</strong> Traits: Defining Shared Behavior</a></li><li><a href="ch10-03-lifetime-syntax.html"><strong>10.3.</strong> Validating References with Lifetimes</a></li></ul></li><li><a href="ch11-00-testing.html"><strong>11.</strong> Testing</a></li><li><ul class="section"><li><a href="ch11-01-writing-tests.html"><strong>11.1.</strong> Writing tests</a></li><li><a href="ch11-02-running-tests.html"><strong>11.2.</strong> Running tests</a></li><li><a href="ch11-03-test-organization.html"><strong>11.3.</strong> Test Organization</a></li></ul></li><li><a href="ch12-00-an-io-project.html"><strong>12.</strong> An I/O Project</a></li><li><ul class="section"><li><a href="ch12-01-accepting-command-line-arguments.html"><strong>12.1.</strong> Accepting Command Line Arguments</a></li><li><a href="ch12-02-reading-a-file.html"><strong>12.2.</strong> Reading a File</a></li><li><a href="ch12-03-improving-error-handling-and-modularity.html"><strong>12.3.</strong> Improving Error Handling and Modularity</a></li><li><a href="ch12-04-testing-the-librarys-functionality.html"><strong>12.4.</strong> Testing the Library's Functionality</a></li><li><a href="ch12-05-working-with-environment-variables.html"><strong>12.5.</strong> Working with Environment Variables</a></li><li><a href="ch12-06-writing-to-stderr-instead-of-stdout.html"><strong>12.6.</strong> Writing to <code>stderr</code> instead of <code>stdout</code></a></li></ul></li><li><a href="ch13-00-functional-features.html"><strong>13.</strong> Functional Language Features in Rust</a></li><li><ul class="section"><li><a href="ch13-01-closures.html"><strong>13.1.</strong> Closures</a></li><li><a href="ch13-02-iterators.html"><strong>13.2.</strong> Iterators</a></li><li><a href="ch13-03-improving-our-io-project.html"><strong>13.3.</strong> Improving our I/O Project</a></li><li><a href="ch13-04-performance.html"><strong>13.4.</strong> Performance</a></li></ul></li><li><a href="ch14-00-more-about-cargo.html"><strong>14.</strong> More about Cargo and Crates.io</a></li><li><ul class="section"><li><a href="ch14-01-release-profiles.html"><strong>14.1.</strong> Release Profiles</a></li><li><a href="ch14-02-publishing-to-crates-io.html"><strong>14.2.</strong> Publishing a Crate to Crates.io</a></li><li><a href="ch14-03-cargo-workspaces.html"><strong>14.3.</strong> Cargo Workspaces</a></li><li><a href="ch14-04-installing-binaries.html"><strong>14.4.</strong> Installing Binaries from Crates.io with <code>cargo install</code></a></li><li><a href="ch14-05-extending-cargo.html"><strong>14.5.</strong> Extending Cargo with Custom Commands</a></li></ul></li><li><a href="ch15-00-smart-pointers.html"><strong>15.</strong> Smart Pointers</a></li><li><ul class="section"><li><a href="ch15-01-box.html"><strong>15.1.</strong> <code>Box<T></code> Points to Data on the Heap and Has a Known Size</a></li><li><a href="ch15-02-deref.html"><strong>15.2.</strong> The <code>Deref</code> Trait Allows Access to the Data Through a Reference</a></li><li><a href="ch15-03-drop.html"><strong>15.3.</strong> The <code>Drop</code> Trait Runs Code on Cleanup</a></li><li><a href="ch15-04-rc.html"><strong>15.4.</strong> <code>Rc<T></code>, the Reference Counted Smart Pointer</a></li><li><a href="ch15-05-interior-mutability.html"><strong>15.5.</strong> <code>RefCell<T></code> and the Interior Mutability Pattern</a></li><li><a href="ch15-06-reference-cycles.html"><strong>15.6.</strong> Creating Reference Cycles and Leaking Memory is Safe</a></li></ul></li><li><a href="ch16-00-concurrency.html"><strong>16.</strong> Fearless Concurrency</a></li><li><ul class="section"><li><a href="ch16-01-threads.html"><strong>16.1.</strong> Threads</a></li><li><a href="ch16-02-message-passing.html"><strong>16.2.</strong> Message Passing</a></li><li><a href="ch16-03-shared-state.html"><strong>16.3.</strong> Shared State</a></li><li><a href="ch16-04-extensible-concurrency-sync-and-send.html"><strong>16.4.</strong> Extensible Concurrency: <code>Sync</code> and <code>Send</code></a></li></ul></li><li><a href="ch17-00-oop.html"><strong>17.</strong> Is Rust an Object-Oriented Programming Language?</a></li><li><ul class="section"><li><a href="ch17-01-what-is-oo.html"><strong>17.1.</strong> What Does Object-Oriented Mean?</a></li><li><a href="ch17-02-trait-objects.html"><strong>17.2.</strong> Trait Objects for Using Values of Different Types</a></li><li><a href="ch17-03-oo-design-patterns.html"><strong>17.3.</strong> Object-Oriented Design Pattern Implementations</a></li></ul></li><li><a href="ch18-00-patterns.html"><strong>18.</strong> Patterns Match the Structure of Values</a></li><li><ul class="section"><li><a href="ch18-01-all-the-places-for-patterns.html" class="active"><strong>18.1.</strong> All the Places Patterns May be Used</a></li><li><a href="ch18-02-refutability.html"><strong>18.2.</strong> Refutability: Whether a Pattern Might Fail to Match</a></li><li><a href="ch18-03-pattern-syntax.html"><strong>18.3.</strong> All the Pattern Syntax</a></li></ul></li><li><a href="ch19-00-advanced-features.html"><strong>19.</strong> Advanced Features</a></li><li><ul class="section"><li><a href="ch19-01-unsafe-rust.html"><strong>19.1.</strong> Unsafe Rust</a></li><li><a href="ch19-02-advanced-lifetimes.html"><strong>19.2.</strong> Advanced Lifetimes</a></li><li><a href="ch19-03-advanced-traits.html"><strong>19.3.</strong> Advanced Traits</a></li><li><a href="ch19-04-advanced-types.html"><strong>19.4.</strong> Advanced Types</a></li><li><a href="ch19-05-advanced-functions-and-closures.html"><strong>19.5.</strong> Advanced Functions & Closures</a></li></ul></li><li><a href="ch20-00-final-project-a-web-server.html"><strong>20.</strong> Final Project: Building a Multithreaded Web Server</a></li><li><ul class="section"><li><a href="ch20-01-single-threaded.html"><strong>20.1.</strong> A Single Threaded Web Server</a></li><li><a href="ch20-02-slow-requests.html"><strong>20.2.</strong> How Slow Requests Affect Throughput</a></li><li><a href="ch20-03-designing-the-interface.html"><strong>20.3.</strong> Designing the Thread Pool Interface</a></li><li><a href="ch20-04-storing-threads.html"><strong>20.4.</strong> Creating the Thread Pool and Storing Threads</a></li><li><a href="ch20-05-sending-requests-via-channels.html"><strong>20.5.</strong> Sending Requests to Threads Via Channels</a></li><li><a href="ch20-06-graceful-shutdown-and-cleanup.html"><strong>20.6.</strong> Graceful Shutdown and Cleanup</a></li></ul></li><li><a href="appendix-00.html"><strong>21.</strong> Appendix</a></li><li><ul class="section"><li><a href="appendix-01-keywords.html"><strong>21.1.</strong> A - Keywords</a></li><li><a href="appendix-02-operators.html"><strong>21.2.</strong> B - Operators</a></li><li><strong>21.3.</strong> C - Derivable Traits</li><li><strong>21.4.</strong> D - Nightly Rust</li><li><strong>21.5.</strong> E - Macros</li><li><strong>21.6.</strong> F - Translations</li><li><a href="appendix-07-newest-features.html"><strong>21.7.</strong> G - Newest Features</a></li></ul></li></ul> </div> <div id="page-wrapper" class="page-wrapper has-warning"> <div class="page"> <header><p class="warning">You are reading a <strong>draft</strong> of the next edition of TRPL. For more, go <a href="../index.html">here</a>.</p></header> <div id="menu-bar" class="menu-bar"> <div class="left-buttons"> <i id="sidebar-toggle" class="fa fa-bars"></i> <i id="theme-toggle" class="fa fa-paint-brush"></i> </div> <h1 class="menu-title">The Rust Programming Language</h1> <div class="right-buttons"> <i id="print-button" class="fa fa-print" title="Print this book"></i> </div> </div> <div id="content" class="content"> <a class="header" href="ch18-01-all-the-places-for-patterns.html#all-the-places-patterns-may-be-used" id="all-the-places-patterns-may-be-used"><h2>All the Places Patterns May be Used</h2></a> <p>Patterns pop up in a number of places in Rust. You've been using them a lot without realizing it! This section is a reference to all the places where patterns are valid.</p> <a class="header" href="ch18-01-all-the-places-for-patterns.html#match-arms" id="match-arms"><h3><code>match</code> Arms</h3></a> <p>As we discussed in Chapter 6, a common place patterns are used is in the arms of <code>match</code> expressions. Formally, <code>match</code> expressions are defined as the keyword <code>match</code>, a value to match on, and one or more match arms that consist of a pattern and an expression to run if the value matches that arm's pattern:</p> <pre><code class="language-text">match VALUE { PATTERN => EXPRESSION, PATTERN => EXPRESSION, PATTERN => EXPRESSION, } </code></pre> <a class="header" href="ch18-01-all-the-places-for-patterns.html#exhaustiveness-and-the-default-pattern-_" id="exhaustiveness-and-the-default-pattern-_"><h4>Exhaustiveness and the Default Pattern <code>_</code></h4></a> <p><code>match</code> expressions are required to be exhaustive. When we put all of the patterns in the arms together, all possibilities for the value in the <code>match</code> expression must be accounted for. One way to ensure you have every possibility covered is to have a catch-all pattern for the last arm, like a variable name. A name matching any value can never fail and thus covers every case remaining after the previous arms' patterns.</p> <p>There's an additional pattern that's often used in the last match arm: <code>_</code>. It matches anything, but it never binds any variables. This can be useful when you only want to run code for some patterns but ignore any other value, for example.</p> <a class="header" href="ch18-01-all-the-places-for-patterns.html#if-let-expressions" id="if-let-expressions"><h3><code>if let</code> Expressions</h3></a> <p>We discussed <code>if let</code> expressions in Chapter 6, and how they're mostly a shorter way to write the equivalent of a <code>match</code> that only cares about matching one case. <code>if let</code> can optionally have a corresponding <code>else</code> with code to run if the pattern in the <code>if let</code> doesn't match.</p> <p>Listing 18-1 shows that it's even possible to mix and match <code>if let</code>, <code>else if</code>, and <code>else if let</code>. This code shows a series of checks of a bunch of different conditions to decide what the background color should be. For the purposes of the example, we've created variables with hardcoded values that a real program might get by asking the user. If the user has specified a favorite color, we'll use that as the background color. If today is Tuesday, the background color will be green. If the user has specified their age as a string and we can parse it as a number successfully, we'll use either purple or orange depending on the value of the parsed number. Finally, if none of these conditions apply, the background color will be blue:</p> <p><span class="filename">Filename: src/main.rs</span></p> <pre><pre class="playpen"><code class="language-rust">fn main() { let favorite_color: Option<&str> = None; let is_tuesday = false; let age: Result<u8, _> = "34".parse(); if let Some(color) = favorite_color { println!("Using your favorite color, {}, as the background", color); } else if is_tuesday { println!("Tuesday is green day!"); } else if let Ok(age) = age { if age > 30 { println!("Using purple as the background color"); } else { println!("Using orange as the background color"); } } else { println!("Using blue as the background color"); } } </code></pre></pre> <p><span class="caption">Listing 18-1: Mixing <code>if let</code>, <code>else if</code>, <code>else if let</code>, and <code>else</code></span></p> <p>This conditional structure lets us support complex requirements. With the hardcoded values we have here, this example will print <code>Using purple as the background color</code>.</p> <p>Note that <code>if let</code> can also introduce shadowed variables like <code>match</code> arms can: <code>if let Ok(age) = age</code> introduces a new shadowed <code>age</code> variable that contains the value inside the <code>Ok</code> variant. This also means the <code>if age > 30</code> condition needs to go within the block; we aren't able to combine these two conditions into <code>if let Ok(age) = age && age > 30</code> since the shadowed <code>age</code> that we want to compare to 30 isn't valid until the new scope starts with the curly brace.</p> <p>Also note that conditionals with many cases like these are not as powerful as <code>match</code> expression since exhaustiveness is not checked by the compiler. If we leave off the last <code>else</code> block and miss handling some cases, the compiler will not error. This example might be too complex to rewrite as a readable <code>match</code>, so we should take extra care to check that we're handling all the cases since the compiler is not checking exhaustiveness for us.</p> <a class="header" href="ch18-01-all-the-places-for-patterns.html#while-let" id="while-let"><h3><code>while let</code></h3></a> <p>A similar construction to <code>if let</code> is <code>while let</code>: this allows you to do a <code>while</code> loop as long as a pattern continues to match. Listing 18-2 shows an example using a <code>while let</code> loop to use a vector as a stack and print out the values in the vector in the opposite order that we pushed the values in:</p> <pre><pre class="playpen"><code class="language-rust"># #![allow(unused_variables)] #fn main() { let mut stack = Vec::new(); stack.push(1); stack.push(2); stack.push(3); while let Some(top) = stack.pop() { println!("{}", top); } #}</code></pre></pre> <p><span class="caption">Listing 18-2: Using a <code>while let</code> loop to print out values as long as <code>stack.pop()</code> returns <code>Some</code></span></p> <p>This example will print 3, 2, then 1. The <code>pop</code> method takes the last element out of the vector and returns <code>Some(value)</code>. If the vector is empty, it returns <code>None</code>. The <code>while</code> loop will continue running the code in its block as long as <code>pop</code> is returning <code>Some</code>. Once it returns <code>None</code>, the <code>while</code> loop stops. We can use <code>while let</code> to pop every element off our stack.</p> <a class="header" href="ch18-01-all-the-places-for-patterns.html#for-loops" id="for-loops"><h3><code>for</code> loops</h3></a> <p>Looping with <code>for</code>, as we discussed in Chapter 3, is the most common loop construction in Rust code. What we didn't talk about in that chapter was that <code>for</code> takes a pattern. In Listing 18-3, we're demonstrating how we can use a pattern in a <code>for</code> loop to destructure a tuple. The <code>enumerate</code> method adapts an iterator to produce a value and the index of the value in the iterator in a tuple:</p> <pre><pre class="playpen"><code class="language-rust"># #![allow(unused_variables)] #fn main() { let v = vec![1, 2, 3]; for (index, value) in v.iter().enumerate() { println!("{} is at index {}", value, index); } #}</code></pre></pre> <p><span class="caption">Listing 18-3: Using a pattern in a <code>for</code> loop to destructure the tuple returned from <code>enumerate</code> into its pieces</span></p> <p>This will print:</p> <pre><code class="language-text">1 is at index 0 2 is at index 1 3 is at index 2 </code></pre> <p>The first call to <code>enumerate</code> produces the tuple <code>(0, 1)</code>. When this value is matched to the pattern <code>(index, value)</code>, <code>index</code> will be 0 and <code>value</code> will be 1.</p> <a class="header" href="ch18-01-all-the-places-for-patterns.html#let-statements" id="let-statements"><h3><code>let</code> Statements</h3></a> <p><code>match</code> and <code>if let</code> are the places we've explicitly discussed using patterns earlier in the book, but they aren't the only places we've <em>used</em> patterns. For example, consider this straightforward variable assignment with <code>let</code>:</p> <pre><pre class="playpen"><code class="language-rust"># #![allow(unused_variables)] #fn main() { let x = 5; #}</code></pre></pre> <p>We've done this hundreds of times throughout this book. You may not have realized it, but you were using patterns! A <code>let</code> statement looks like this, more formally:</p> <pre><code class="language-text">let PATTERN = EXPRESSION; </code></pre> <p>We've seen statements like <code>let x = 5;</code> with a variable name in the <code>PATTERN</code> slot; a variable name is just a particularly humble form of pattern.</p> <p>With <code>let</code>, we compare the expression against the pattern, and assign any names we find. So for example, in our <code>let x = 5;</code> case, <code>x</code> is a pattern that says "bind what matches here to the variable <code>x</code>." And since the name <code>x</code> is the whole pattern, this pattern effectively means "bind everything to the variable <code>x</code>, whatever the value is."</p> <p>To see the pattern matching aspect of <code>let</code> a bit more clearly, consider Listing 18-4 where we're using a pattern with <code>let</code> to destructuring a tuple:</p> <pre><pre class="playpen"><code class="language-rust"># #![allow(unused_variables)] #fn main() { let (x, y, z) = (1, 2, 3); #}</code></pre></pre> <p><span class="caption">Listing 18-4: Using a pattern to destructure a tuple and create 3 variables at once</span></p> <p>Here, we have a tuple that we're matching against a pattern. Rust will compare the value <code>(1, 2, 3)</code> to the pattern <code>(x, y, z)</code> and see that the value matches the pattern. In this case, it will bind <code>1</code> to <code>x</code>, <code>2</code> to <code>y</code>, and <code>3</code> to <code>z</code>. You can think of this tuple pattern as nesting three individual variable patterns inside of it.</p> <p>We saw another example of destructuring a tuple in Chapter 16, Listing 16-6, where we destructured the return value of <code>mpsc::channel()</code> into the <code>tx</code> (transmitter) and <code>rx</code> (receiver) parts.</p> <a class="header" href="ch18-01-all-the-places-for-patterns.html#function-parameters" id="function-parameters"><h3>Function Parameters</h3></a> <p>Similarly to <code>let</code>, function parameters can also be patterns. The code in Listing 18-5 declaring a function named <code>foo</code> that takes one parameter named <code>x</code> of type <code>i32</code> should look familiar:</p> <pre><pre class="playpen"><code class="language-rust"># #![allow(unused_variables)] #fn main() { fn foo(x: i32) { // code goes here } #}</code></pre></pre> <p><span class="caption">Listing 18-5: A function signature uses patterns in the parameters</span></p> <p>The <code>x</code> part is a pattern! In a similar way as we did with <code>let</code>, we could match a tuple in a function's arguments. Listing 18-6 shows how we could split apart the values in a tuple as part of passing the tuple to a function:</p> <p><span class="filename">Filename: src/main.rs</span></p> <pre><pre class="playpen"><code class="language-rust">fn print_coordinates(&(x, y): &(i32, i32)) { println!("Current location: ({}, {})", x, y); } fn main() { let point = (3, 5); print_coordinates(&point); } </code></pre></pre> <p><span class="caption">Listing 18-6: A function with parameters that destructure a tuple</span></p> <p>This will print <code>Current location: (3, 5)</code>. When we pass the value <code>&(3, 5)</code> to <code>print_coordinates</code>, the values match the pattern <code>&(x, y)</code>. <code>x</code> gets the value 3, and <code>y</code> gets the value 5.</p> <p>Because closures are similar to functions, as we discussed in Chapter 13, we can use patterns in closure parameter lists as well.</p> <p>One difference between the places we can use patterns is that with <code>for</code> loops, <code>let</code>, and in function parameters, the patterns must be <em>irrefutable</em>. Let's discuss that next.</p> </div> <!-- Mobile navigation buttons --> <a href="ch18-00-patterns.html" class="mobile-nav-chapters previous"> <i class="fa fa-angle-left"></i> </a> <a href="ch18-02-refutability.html" class="mobile-nav-chapters next"> <i class="fa fa-angle-right"></i> </a> </div> <a href="ch18-00-patterns.html" class="nav-chapters previous" title="You can navigate through the chapters using the arrow keys"> <i class="fa fa-angle-left"></i> </a> <a href="ch18-02-refutability.html" class="nav-chapters next" title="You can navigate through the chapters using the arrow keys"> <i class="fa fa-angle-right"></i> </a> </div> <!-- Local fallback for Font Awesome --> <script> if ($(".fa").css("font-family") !== "FontAwesome") { $('<link rel="stylesheet" type="text/css" href="_FontAwesome/css/font-awesome.css">').prependTo('head'); } </script> <!-- Livereload script (if served using the cli tool) --> <script src="highlight.js"></script> <script src="book.js"></script> </body> </html>