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