@@ -275,14 +275,15 @@ new type and draw it because `SelectBox` implements the `Draw` trait, which
275
275
means it implements the ` draw ` method.
276
276
277
277
This concept—of being concerned only with the messages a value responds to
278
- rather than the value’s concrete type—is similar to the concept * duck typing*
279
- in dynamically typed languages: if it walks like a duck and quacks like a duck,
280
- then it must be a duck! In the implementation of ` run ` on ` Screen ` in Listing
281
- 17-5, ` run ` doesn’t need to know what the concrete type of each component is.
282
- It doesn’t check whether a component is an instance of a ` Button ` or a
283
- ` SelectBox ` , it just calls the ` draw ` method on the component. By specifying
284
- ` Box<dyn Draw> ` as the type of the values in the ` components ` vector, we’ve
285
- defined ` Screen ` to need values that we can call the ` draw ` method on.
278
+ rather than the value’s concrete type—is similar to the concept of * duck
279
+ typing* in dynamically typed languages: if it walks like a duck and quacks
280
+ like a duck, then it must be a duck! In the implementation of ` run ` on ` Screen `
281
+ in Listing 17-5, ` run ` doesn’t need to know what the concrete type of each
282
+ component is. It doesn’t check whether a component is an instance of a ` Button `
283
+ or a ` SelectBox ` , it just calls the ` draw ` method on the component. By
284
+ specifying ` Box<dyn Draw> ` as the type of the values in the ` components `
285
+ vector, we’ve defined ` Screen ` to need values that we can call the ` draw `
286
+ method on.
286
287
287
288
The advantage of using trait objects and Rust’s type system to write code
288
289
similar to code using duck typing is that we never have to check whether a
0 commit comments