官术网_书友最值得收藏!

Generic implementations

We can also write impl blocks for our generic types too, but it gets verbose here because of the extra generic type parameters, as we'll see. Let's implement a new() method on our Container<T> struct:

// generic_struct_impl.rs

struct Container<T> {
item: T
}

impl Container<T> {
fn new(item: T) -> Self {
Container { item }
}
}

fn main() {
// stuff
}

Let's compile this:

The error message cannot find our generic type T. When writing an impl block for any generic type, we need to declare the generic type parameter before using it within our type. T is just like a variable—a type variable—and we need to declare it. Therefore, we need to modify the implementation block a bit by adding <T> after impl, like so:

impl<T> Container<T> {
fn new(item: T) -> Self {
Container { item }
}
}

With that change, the preceding code compiles. The previous impl block  basically means that we are implementing these methods for all types T, which appear in Container<T>. This impl block is a generic implementation. Therefore, every concrete Container that ever gets generated will have these methods. Now, we could have also written a more specific impl block for Container<T> by putting any concrete type in place of T. This is what it would look like:

impl Container<u32> {
fn sum(item: u32) -> Self {
Container { item }
}
}

In the preceding code, we implemented a method called sum, which is only present on Container<u32> types. Here, we don't need the <T> after impl because of the presence of u32 as a concrete type. This is another nice property of impl blocks, which allows you to specialize generic types by implementing methods independently.

主站蜘蛛池模板: 延川县| 德江县| 阿克| 六枝特区| 资中县| 偃师市| 淳化县| 黔江区| 苏尼特右旗| 湘潭市| 石柱| 静安区| 广河县| 辽宁省| 犍为县| 乡城县| 鹤山市| 广宁县| 南丰县| 吴忠市| 河池市| 赤峰市| 什邡市| 宁明县| 阳城县| 满城县| 水城县| 鄂托克前旗| 邳州市| 清水河县| 南汇区| 鹿邑县| 怀安县| 察雅县| 星座| 沽源县| 淮北市| 新绛县| 汉源县| 张北县| 清镇市|