Files
google_speech_rs/docs/paste/index.html
T
2021-06-02 05:29:43 +00:00

116 lines
14 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="githubcrates-iodocs-rs"><meta name="keywords" content="rust, rustlang, rust-lang, paste"><title>paste - Rust</title><link rel="stylesheet" type="text/css" href="../normalize.css"><link rel="stylesheet" type="text/css" href="../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../ayu.css" disabled ><script id="default-settings"></script><script src="../storage.js"></script><script src="../crates.js"></script><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../favicon.svg">
<link rel="alternate icon" type="image/png" href="../favicon-16x16.png">
<link rel="alternate icon" type="image/png" href="../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">&#9776;</div><a href='../paste/index.html'><div class='logo-container rust-logo'><img src='../rust-logo.png' alt='logo'></div></a><p class="location">Crate paste</p><div class="block version"><p>Version 0.1.18</p></div><div class="sidebar-elems"><a id="all-types" href="all.html"><p>See all paste's items</p></a><div class="block items"><ul><li><a href="#macros">Macros</a></li></ul></div><p class="location"></p><div id="sidebar-vars" data-name="paste" data-ty="mod" data-relpath="../"></div></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu"><img src="../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><script src="../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><button type="button" class="help-button">?</button>
<a id="settings-menu" href="../settings.html"><img src="../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Crate <a class="mod" href="">paste</a></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">&#x2212;</span>]</a></span><a class="srclink" href="../src/paste/lib.rs.html#1-158" title="goto source code">[src]</a></span></h1><div class="docblock"><p><a href="https://github.com/dtolnay/paste"><img src="https://img.shields.io/badge/github-8da0cb?style=for-the-badge&amp;labelColor=555555&amp;logo=github" alt="github" /></a><a href="https://crates.io/crates/paste"><img src="https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&amp;labelColor=555555&amp;logo=rust" alt="crates-io" /></a><a href="https://docs.rs/paste"><img src="https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&amp;labelColor=555555&amp;logoColor=white&amp;logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoIGZpbGw9IiNmNWY1ZjUiIGQ9Ik00ODguNiAyNTAuMkwzOTIgMjE0VjEwNS41YzAtMTUtOS4zLTI4LjQtMjMuNC0zMy43bC0xMDAtMzcuNWMtOC4xLTMuMS0xNy4xLTMuMS0yNS4zIDBsLTEwMCAzNy41Yy0xNC4xIDUuMy0yMy40IDE4LjctMjMuNCAzMy43VjIxNGwtOTYuNiAzNi4yQzkuMyAyNTUuNSAwIDI2OC45IDAgMjgzLjlWMzk0YzAgMTMuNiA3LjcgMjYuMSAxOS45IDMyLjJsMTAwIDUwYzEwLjEgNS4xIDIyLjEgNS4xIDMyLjIgMGwxMDMuOS01MiAxMDMuOSA1MmMxMC4xIDUuMSAyMi4xIDUuMSAzMi4yIDBsMTAwLTUwYzEyLjItNi4xIDE5LjktMTguNiAxOS45LTMyLjJWMjgzLjljMC0xNS05LjMtMjguNC0yMy40LTMzLjd6TTM1OCAyMTQuOGwtODUgMzEuOXYtNjguMmw4NS0zN3Y3My4zek0xNTQgMTA0LjFsMTAyLTM4LjIgMTAyIDM4LjJ2LjZsLTEwMiA0MS40LTEwMi00MS40di0uNnptODQgMjkxLjFsLTg1IDQyLjV2LTc5LjFsODUtMzguOHY3NS40em0wLTExMmwtMTAyIDQxLjQtMTAyLTQxLjR2LS42bDEwMi0zOC4yIDEwMiAzOC4ydi42em0yNDAgMTEybC04NSA0Mi41di03OS4xbDg1LTM4Ljh2NzUuNHptMC0xMTJsLTEwMiA0MS40LTEwMi00MS40di0uNmwxMDItMzguMiAxMDIgMzguMnYuNnoiPjwvcGF0aD48L3N2Zz4K" alt="docs-rs" /></a></p>
<br>
<p>The nightly-only <a href="https://doc.rust-lang.org/std/macro.concat_idents.html"><code>concat_idents!</code></a> macro in the Rust standard library is
notoriously underpowered in that its concatenated identifiers can only refer to
existing items, they can never be used to define something new.</p>
<p>This crate provides a flexible way to paste together identifiers in a macro,
including using pasted identifiers to define new items.</p>
<p>This approach works with any stable or nightly Rust compiler 1.30+.</p>
<br>
<h1 id="pasting-identifiers" class="section-header"><a href="#pasting-identifiers">Pasting identifiers</a></h1>
<p>There are two entry points, <code>paste::expr!</code> for macros in expression position and
<code>paste::item!</code> for macros in item position.</p>
<p>Within either one, identifiers inside <code>[&lt;</code><code>&gt;]</code> are pasted together to form a
single identifier.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="comment">// Macro in item position: at module scope or inside of an impl block.</span>
<span class="ident">paste</span>::<span class="macro">item</span><span class="macro">!</span> {
<span class="comment">// Defines a const called `QRST`.</span>
<span class="kw">const</span> [<span class="op">&lt;</span><span class="ident">Q</span> <span class="ident">R</span> <span class="ident">S</span> <span class="ident">T</span><span class="op">&gt;</span>]: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;success!&quot;</span>;
}
<span class="kw">fn</span> <span class="ident">main</span>() {
<span class="comment">// Macro in expression position: inside a function body.</span>
<span class="macro">assert_eq</span><span class="macro">!</span>(
<span class="ident">paste</span>::<span class="macro">expr</span><span class="macro">!</span> { [<span class="op">&lt;</span><span class="ident">Q</span> <span class="ident">R</span> <span class="ident">S</span> <span class="ident">T</span><span class="op">&gt;</span>].<span class="ident">len</span>() },
<span class="number">8</span>,
);
}</pre></div>
<p><br><br></p>
<h1 id="more-elaborate-examples" class="section-header"><a href="#more-elaborate-examples">More elaborate examples</a></h1>
<p>This program demonstrates how you may want to bundle a paste invocation inside
of a more convenient user-facing macro of your own. Here the <code>routes!(A, B)</code>
macro expands to a vector containing <code>ROUTE_A</code> and <code>ROUTE_B</code>.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="kw">const</span> <span class="ident">ROUTE_A</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;/a&quot;</span>;
<span class="kw">const</span> <span class="ident">ROUTE_B</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;/b&quot;</span>;
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">routes</span> {
($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">route</span>:<span class="ident">ident</span>),<span class="kw-2">*</span>) <span class="op">=</span><span class="op">&gt;</span> {{
<span class="ident">paste</span>::<span class="macro">expr</span><span class="macro">!</span> {
<span class="macro">vec</span><span class="macro">!</span>[$( [<span class="op">&lt;</span><span class="ident">ROUTE_</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">route</span><span class="op">&gt;</span>] ),<span class="kw-2">*</span>]
}
}}
}
<span class="kw">fn</span> <span class="ident">main</span>() {
<span class="kw">let</span> <span class="ident">routes</span> <span class="op">=</span> <span class="macro">routes</span><span class="macro">!</span>(<span class="ident">A</span>, <span class="ident">B</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">routes</span>, <span class="macro">vec</span><span class="macro">!</span>[<span class="string">&quot;/a&quot;</span>, <span class="string">&quot;/b&quot;</span>]);
}</pre></div>
<p>The next example shows a macro that generates accessor methods for some struct
fields.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">make_a_struct_and_getters</span> {
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">name</span>:<span class="ident">ident</span> { $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">field</span>:<span class="ident">ident</span>),<span class="op">*</span> }) <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// Define a struct. This expands to:</span>
<span class="comment">//</span>
<span class="comment">// pub struct S {</span>
<span class="comment">// a: String,</span>
<span class="comment">// b: String,</span>
<span class="comment">// c: String,</span>
<span class="comment">// }</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">name</span> {
$(
<span class="macro-nonterminal">$</span><span class="macro-nonterminal">field</span>: <span class="ident">String</span>,
)<span class="op">*</span>
}
<span class="comment">// Build an impl block with getters. This expands to:</span>
<span class="comment">//</span>
<span class="comment">// impl S {</span>
<span class="comment">// pub fn get_a(&amp;self) -&gt; &amp;str { &amp;self.a }</span>
<span class="comment">// pub fn get_b(&amp;self) -&gt; &amp;str { &amp;self.b }</span>
<span class="comment">// pub fn get_c(&amp;self) -&gt; &amp;str { &amp;self.c }</span>
<span class="comment">// }</span>
<span class="ident">paste</span>::<span class="macro">item</span><span class="macro">!</span> {
<span class="kw">impl</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">name</span> {
$(
<span class="kw">pub</span> <span class="kw">fn</span> [<span class="op">&lt;</span><span class="ident">get_</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">field</span><span class="op">&gt;</span>](<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="kw-2">&amp;</span><span class="ident">str</span> {
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="macro-nonterminal">$</span><span class="macro-nonterminal">field</span>
}
)<span class="op">*</span>
}
}
}
}
<span class="macro">make_a_struct_and_getters</span><span class="macro">!</span>(<span class="ident">S</span> { <span class="ident">a</span>, <span class="ident">b</span>, <span class="ident">c</span> });
<span class="kw">fn</span> <span class="ident">call_some_getters</span>(<span class="ident">s</span>: <span class="kw-2">&amp;</span><span class="ident">S</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">bool</span> {
<span class="ident">s</span>.<span class="ident">get_a</span>() <span class="op">=</span><span class="op">=</span> <span class="ident">s</span>.<span class="ident">get_b</span>() <span class="op">&amp;&amp;</span> <span class="ident">s</span>.<span class="ident">get_c</span>().<span class="ident">is_empty</span>()
}</pre></div>
<p><br><br></p>
<h1 id="case-conversion" class="section-header"><a href="#case-conversion">Case conversion</a></h1>
<p>Use <code>$var:lower</code> or <code>$var:upper</code> in the segment list to convert an
interpolated segment to lower- or uppercase as part of the paste. For
example, <code>[&lt;ld_ $reg:lower _expr&gt;]</code> would paste to <code>ld_bc_expr</code> if invoked
with $reg=<code>Bc</code>.</p>
<p>Use <code>$var:snake</code> to convert CamelCase input to snake_case.
Use <code>$var:camel</code> to convert snake_case to CamelCase.
These compose, so for example <code>$var:snake:upper</code> would give you SCREAMING_CASE.</p>
<p>The precise Unicode conversions are as defined by <a href="https://doc.rust-lang.org/std/primitive.str.html#method.to_lowercase"><code>str::to_lowercase</code></a> and
<a href="https://doc.rust-lang.org/std/primitive.str.html#method.to_uppercase"><code>str::to_uppercase</code></a>.</p>
</div><h2 id="macros" class="section-header"><a href="#macros">Macros</a></h2>
<table><tr class="module-item"><td><a class="macro" href="macro.expr.html" title="paste::expr macro">expr</a></td><td class="docblock-short"><p>Paste identifiers within a macro invocation that expands to an expression.</p>
</td></tr><tr class="module-item"><td><a class="macro" href="macro.item.html" title="paste::item macro">item</a></td><td class="docblock-short"><p>Paste identifiers within a macro invocation that expands to one or more
items.</p>
</td></tr><tr class="module-item"><td><a class="macro" href="macro.item_with_macros.html" title="paste::item_with_macros macro">item_with_macros</a></td><td class="docblock-short"><p>Paste identifiers within a macro invocation that expands to one or more
macro_rules macros or items containing macros.</p>
</td></tr></table></section><section id="search" class="content hidden"></section><section class="footer"></section><div id="rustdoc-vars" data-root-path="../" data-current-crate="paste" data-search-js="../search-index.js"></div>
<script src="../main.js"></script></body></html>