diff --git a/src/generics-traits/generics.md b/src/generics-traits/generics.md index 2e9604b..1896f48 100644 --- a/src/generics-traits/generics.md +++ b/src/generics-traits/generics.md @@ -34,7 +34,7 @@ fn main() { 2. 🌟🌟 A function call with explicitly specified type parameters looks like: `fun::()`. ```rust,editable -// implement a generic function +// implement the generic function below fn sum fn main() { @@ -124,7 +124,7 @@ fn main() { 7. 🌟🌟 ```rust,editable -// make the code work +// fix the errors to make the code work struct Point { x: T, y: T, diff --git a/zh-CN/src/SUMMARY.md b/zh-CN/src/SUMMARY.md index 8247e0f..d4f375b 100644 --- a/zh-CN/src/SUMMARY.md +++ b/zh-CN/src/SUMMARY.md @@ -22,7 +22,7 @@ - [match, matches! 和 if let](pattern-match/match-iflet.md) - [模式](pattern-match/patterns.md) - [方法和关联函数](method.md) -- [泛型和特征 todo](generics-traits/intro.md) +- [泛型和特征](generics-traits/intro.md) - [泛型 Generics](generics-traits/generics.md) - [特征 Traits](generics-traits/traits.md) - [特征对象](generics-traits/trait-object.md) diff --git a/zh-CN/src/generics-traits/generics.md b/zh-CN/src/generics-traits/generics.md index 292d26b..cf95429 100644 --- a/zh-CN/src/generics-traits/generics.md +++ b/zh-CN/src/generics-traits/generics.md @@ -1 +1,146 @@ -# Generics +# 泛型 + +### 函数 +1. 🌟🌟🌟 +```rust,editable + +// 填空 +struct A; // 具体的类型 `A`. +struct S(A); // 具体的类型 `S`. +struct SGen(T); // 泛型 `SGen`. + +fn reg_fn(_s: S) {} + +fn gen_spec_t(_s: SGen) {} + +fn gen_spec_i32(_s: SGen) {} + +fn generic(_s: SGen) {} + +fn main() { + // 使用非泛型函数 + reg_fn(__); // 具体的类型 + gen_spec_t(__); // 隐式地指定类型参数 `A`. + gen_spec_i32(__); // 隐式地指定类型参数`i32`. + + // 显式地指定类型参数 `char` + generic::(__); + + // 隐式地指定类型参数 `char`. + generic(__); +} +``` + +1. 🌟🌟 +```rust,editable + +// 实现下面的泛型函数 sum +fn sum + +fn main() { + assert_eq!(5, sum(2i8, 3i8)); + assert_eq!(50, sum(20, 30)); + assert_eq!(2.46, sum(1.23, 1.23)); +} +``` + + +### 结构体和 `impl` + +3. 🌟 +```rust,editable + +// 实现一个结构体 Point 让代码工作 + + +fn main() { + let integer = Point { x: 5, y: 10 }; + let float = Point { x: 1.0, y: 4.0 }; +} +``` + +4. 🌟🌟 +```rust,editable + +// 修改以下结构体让代码工作 +struct Point { + x: T, + y: T, +} + +fn main() { + // 不要修改这行代码! + let p = Point{x: 5, y : "hello".to_string()}; +} +``` + +5. 🌟🌟 +```rust,editable + +// 为 Val 增加泛型参数,不要修改 `main` 中的代码 +struct Val { + val: f64, +} + +impl Val { + fn value(&self) -> &f64 { + &self.val + } +} + + +fn main() { + let x = Val{ val: 3.0 }; + let y = Val{ val: "hello".to_string()}; + println!("{}, {}", x.value(), y.value()); +} +``` + +### 方法 +6. 🌟🌟🌟 + +```rust,editable +struct Point { + x: T, + y: U, +} + +impl Point { + // 实现 mixup,不要修改其它代码! + fn mixup +} + +fn main() { + let p1 = Point { x: 5, y: 10 }; + let p2 = Point { x: "Hello", y: '中'}; + + let p3 = p1.mixup(p2); + + assert_eq!(p3.x, 5); + assert_eq!(p3.y, '中'); +} +``` + +7. 🌟🌟 +```rust,editable + +// 修复错误,让代码工作 +struct Point { + x: T, + y: T, +} + +impl Point { + fn distance_from_origin(&self) -> f32 { + (self.x.powi(2) + self.y.powi(2)).sqrt() + } +} + +fn main() { + let p = Point{x: 5, y: 10}; + println!("{}",p.distance_from_origin()) +} +``` + +> 你可以在[这里](https://github.com/sunface/rust-by-practice)找到答案(在 solutions 路径下) + diff --git a/zh-CN/src/method.md b/zh-CN/src/method.md index 25a356f..5d20ee9 100644 --- a/zh-CN/src/method.md +++ b/zh-CN/src/method.md @@ -255,4 +255,7 @@ fn main() { ## Practice -@todo \ No newline at end of file +@todo + + +> 你可以在[这里](https://github.com/sunface/rust-by-practice)找到答案(在 solutions 路径下) \ No newline at end of file