leisurely8rust


10.泛型

<h1>10.泛型</h1> <h2>1、定义在参数列表前\&lt;T\&gt;</h2> <pre><code>fn add&amp;lt;T&amp;gt;(a:T, b:T) -&amp;gt; T { a + b } fn main() { println!(&amp;quot;add i8: {}&amp;quot;, add(2i8, 3i8)); println!(&amp;quot;add i32: {}&amp;quot;, add(20, 30)); println!(&amp;quot;add f64: {}&amp;quot;, add(1.23, 1.23)); }</code></pre> <h2>2、结构体中使用泛型</h2> <p>结构体名称后面</p> <pre><code>struct Point&amp;lt;T&amp;gt; { x: T, y: T, } fn main() { let integer = Point { x: 5, y: 10 }; let float = Point { x: 1.0, y: 4.0 }; } </code></pre> <h2>3、枚举中使用</h2> <pre><code>enum Option&amp;lt;T&amp;gt; { Some(T), None, }</code></pre> <h2>4、方法中使用泛型</h2> <pre><code>1、只有提前声明&amp;lt;T&amp;gt;,才能在Point&amp;lt;T&amp;gt;中使用它 2、这里的 Point&amp;lt;T&amp;gt; 不再是泛型声明,而是一个完整的结构体类型 struct Point&amp;lt;T&amp;gt; { x: T, y: T, } impl&amp;lt;T&amp;gt; Point&amp;lt;T&amp;gt; { fn x(&amp;amp;self) -&amp;gt; &amp;amp;T { &amp;amp;self.x } } fn main() { let p = Point { x: 5, y: 10 }; println!(&amp;quot;p.x = {}&amp;quot;, p.x()); }</code></pre> <h2>5、const泛型</h2> <pre><code>1、[i32; 2] 和 [i32; 3] 是不同的数组类型,无法用同一个函数调用。 fn display_array(arr: [i32; 3]) { println!(&amp;quot;{:?}&amp;quot;, arr); } fn main() { let arr: [i32; 3] = [1, 2, 3]; display_array(arr); let arr: [i32; 2] = [1, 2]; display_array(arr); } 2、将 i32 改成所有类型(泛型)的数组 会为每个长度单独创建一个函数,假如第一个数组长度是32,就会创建32个函数 fn display_array&amp;lt;T: std::fmt::Debug&amp;gt;(arr: &amp;amp;[T]) { println!(&amp;quot;{:?}&amp;quot;, arr); } fn main() { let arr: [i32; 3] = [1, 2, 3]; display_array(&amp;amp;arr); let arr: [i32; 2] = [1, 2]; display_array(&amp;amp;arr); } 3、const泛型 const N: usize:代表数组长度定义了就不变,假如第一个数组长度是32,就只会创建一个32参数的函数 fn display_array&amp;lt;T: std::fmt::Debug, const N: usize&amp;gt;(arr: [T; N]) { println!(&amp;quot;{:?}&amp;quot;, arr); } fn main() { let arr: [i32; 3] = [1, 2, 3]; display_array(arr); let arr: [i32; 2] = [1, 2]; display_array(arr); }</code></pre>

页面列表

ITEM_HTML