|
1 |
| -//@ run-pass |
2 |
| - |
3 |
| -#![allow(non_camel_case_types)] |
| 1 | +//! Test newtype pattern with generic parameters. |
4 | 2 |
|
| 3 | +//@ run-pass |
5 | 4 |
|
6 | 5 | #[derive(Clone)]
|
7 |
| -struct myvec<X>(Vec<X> ); |
| 6 | +struct MyVec<T>(Vec<T>); |
8 | 7 |
|
9 |
| -fn myvec_deref<X:Clone>(mv: myvec<X>) -> Vec<X> { |
10 |
| - let myvec(v) = mv; |
11 |
| - return v.clone(); |
| 8 | +fn extract_inner_vec<T: Clone>(wrapper: MyVec<T>) -> Vec<T> { |
| 9 | + let MyVec(inner_vec) = wrapper; |
| 10 | + inner_vec.clone() |
12 | 11 | }
|
13 | 12 |
|
14 |
| -fn myvec_elt<X>(mv: myvec<X>) -> X { |
15 |
| - let myvec(v) = mv; |
16 |
| - return v.into_iter().next().unwrap(); |
| 13 | +fn get_first_element<T>(wrapper: MyVec<T>) -> T { |
| 14 | + let MyVec(inner_vec) = wrapper; |
| 15 | + inner_vec.into_iter().next().unwrap() |
17 | 16 | }
|
18 | 17 |
|
19 | 18 | pub fn main() {
|
20 |
| - let mv = myvec(vec![1, 2, 3]); |
21 |
| - let mv_clone = mv.clone(); |
22 |
| - let mv_clone = myvec_deref(mv_clone); |
23 |
| - assert_eq!(mv_clone[1], 2); |
24 |
| - assert_eq!(myvec_elt(mv.clone()), 1); |
25 |
| - let myvec(v) = mv; |
26 |
| - assert_eq!(v[2], 3); |
| 19 | + let my_vec = MyVec(vec![1, 2, 3]); |
| 20 | + let cloned_vec = my_vec.clone(); |
| 21 | + |
| 22 | + // Test extracting inner vector |
| 23 | + let extracted = extract_inner_vec(cloned_vec); |
| 24 | + assert_eq!(extracted[1], 2); |
| 25 | + |
| 26 | + // Test getting first element |
| 27 | + assert_eq!(get_first_element(my_vec.clone()), 1); |
| 28 | + |
| 29 | + // Test direct destructuring |
| 30 | + let MyVec(inner) = my_vec; |
| 31 | + assert_eq!(inner[2], 3); |
27 | 32 | }
|
0 commit comments