|
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