1+ use std:: fmt:: { Display , Error , Formatter } ;
2+
13struct Duck ;
24
35struct Pig ;
@@ -12,16 +14,45 @@ impl Fly for Duck {
1214 }
1315}
1416
17+ impl Display for Duck {
18+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> Result < ( ) , Error > {
19+ f. write_str ( self . fly ( ) . to_string ( ) . as_str ( ) )
20+ }
21+ }
22+
1523impl Fly for Pig {
1624 fn fly ( & self ) -> bool {
1725 false
1826 }
1927}
2028
21- fn fly_static < T : Fly > ( s : T ) -> bool {
29+ impl Display for Pig {
30+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> Result < ( ) , Error > {
31+ f. write_str ( self . fly ( ) . to_string ( ) . as_str ( ) )
32+ }
33+ }
34+
35+ fn fly_static < T : Fly + Display > ( s : T ) -> bool {
36+ s. fly ( )
37+ }
38+
39+ // syntax sugar for fly_static
40+ fn fly_static_1 ( s : impl Fly + Display ) -> bool {
41+ s. fly ( )
42+ }
43+
44+ fn fly_static_2 ( s : & ( impl Fly + Display ) ) -> bool {
2245 s. fly ( )
2346}
2447
48+ fn fly_static_3 < T , U > ( t : & T , u : & U ) -> bool
49+ where
50+ T : Fly + Display ,
51+ U : Fly + Display ,
52+ {
53+ t. fly ( ) && u. fly ( )
54+ }
55+
2556fn fly_dyn ( s : & dyn Fly ) -> bool {
2657 s. fly ( )
2758}
@@ -34,8 +65,11 @@ mod tests {
3465 fn test_trait ( ) {
3566 let pig = Pig ;
3667 assert_eq ! ( fly_static:: <Pig >( pig) , false ) ;
68+ assert_eq ! ( fly_static_1( Pig { } ) , false ) ;
69+ assert_eq ! ( fly_static_2( & Pig { } ) , false ) ;
70+ assert_eq ! ( fly_static_3( & Pig { } , & Pig { } ) , false ) ;
3771
3872 let duck = Duck ;
3973 assert_eq ! ( fly_dyn( & duck) , true ) ;
4074 }
41- }
75+ }
0 commit comments