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