| Inner items do not inherit the generic parameters from the items |
| they are embedded in. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0401 |
| fn foo<T>(x: T) { |
| fn bar(y: T) { // T is defined in the "outer" function |
| // .. |
| } |
| bar(x); |
| } |
| ``` |
| |
| Nor will this: |
| |
| ```compile_fail,E0401 |
| fn foo<T>(x: T) { |
| type MaybeT = Option<T>; |
| // ... |
| } |
| ``` |
| |
| Or this: |
| |
| ```compile_fail,E0401 |
| fn foo<T>(x: T) { |
| struct Foo { |
| x: T, |
| } |
| // ... |
| } |
| ``` |
| |
| Items nested inside other items are basically just like top-level items, except |
| that they can only be used from the item they are in. |
| |
| There are a couple of solutions for this. |
| |
| If the item is a function, you may use a closure: |
| |
| ``` |
| fn foo<T>(x: T) { |
| let bar = |y: T| { // explicit type annotation may not be necessary |
| // .. |
| }; |
| bar(x); |
| } |
| ``` |
| |
| For a generic item, you can copy over the parameters: |
| |
| ``` |
| fn foo<T>(x: T) { |
| fn bar<T>(y: T) { |
| // .. |
| } |
| bar(x); |
| } |
| ``` |
| |
| ``` |
| fn foo<T>(x: T) { |
| type MaybeT<T> = Option<T>; |
| } |
| ``` |
| |
| Be sure to copy over any bounds as well: |
| |
| ``` |
| fn foo<T: Copy>(x: T) { |
| fn bar<T: Copy>(y: T) { |
| // .. |
| } |
| bar(x); |
| } |
| ``` |
| |
| ``` |
| fn foo<T: Copy>(x: T) { |
| struct Foo<T: Copy> { |
| x: T, |
| } |
| } |
| ``` |
| |
| This may require additional type hints in the function body. |
| |
| In case the item is a function inside an `impl`, defining a private helper |
| function might be easier: |
| |
| ``` |
| # struct Foo<T>(T); |
| impl<T> Foo<T> { |
| pub fn foo(&self, x: T) { |
| self.bar(x); |
| } |
| |
| fn bar(&self, y: T) { |
| // .. |
| } |
| } |
| ``` |
| |
| For default impls in traits, the private helper solution won't work, however |
| closures or copying the parameters should still work. |