Multiple Generics With Cacher Example

I found this question very helpful when trying to understand how to extend the Cacher function introduced in Chapter 13.

Im just confused about what is happening here:

T: Fn(K) -> V,
K: hash::Hash + Eq + Clone,
V: Copy,

It makes sense to me that T is a function that takes something of type K and returns type V. But what does it mean that K is of type hash::Hash + Eq + Clone and V is of type Copy. Thanks for any help.

-Dave

Those are trait bounds that the types must satisfy.

  • Hash means that K can be hashed (for a HashMap or HashSet).
  • Eq means that two instances of K can be checked for equality, also needed for a HashMap (so collisions can be detected)
  • Clone means you can duplicate K by cloning it (which may be expensive or may be cheap)
  • Copy means that you can duplicate V by a simple memcpy, which will happen implicitly if needed when you pass the value around or assign it to a new variable

If it's unclear how these are used in any particular part of the code, please give an example. Or try running the code in the Playground, then remove a bound and see what the compiler error says. (If there isn't an error, the bound wasn't needed.)


Side note: T: Fn(K) -> V is also a trait bound. T could be a closure, a function, a function pointer, etc.

2 Likes