diff options
| author | Michael Rosenberg <42micro@gmail.com> | 2015-04-23 20:33:46 -0400 |
|---|---|---|
| committer | Michael Rosenberg <42micro@gmail.com> | 2015-04-23 20:33:46 -0400 |
| commit | 352838ed349d01ae16408221bc6a327bf3651ef2 (patch) | |
| tree | 5b55f62e66bcf67cd2d8f00f4c02b06ba682970c | |
| parent | 90bed3f9479f9f63746f227d5fc4ddecdd37642a (diff) | |
| download | rust-352838ed349d01ae16408221bc6a327bf3651ef2.tar.gz rust-352838ed349d01ae16408221bc6a327bf3651ef2.zip | |
Update "Generic Functions" section
Updated sample code to updated syntax (now compiles). Also tweaked the text to reflect the change.
| -rw-r--r-- | src/doc/reference.md | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/src/doc/reference.md b/src/doc/reference.md index d918a320e63..930cf44fd2c 100644 --- a/src/doc/reference.md +++ b/src/doc/reference.md @@ -1099,40 +1099,31 @@ signature. Each type parameter must be explicitly declared, in an angle-bracket-enclosed, comma-separated list following the function name. ```{.ignore} -fn iter<T>(seq: &[T], f: |T|) { - for elt in seq.iter() { f(elt); } +fn iter<T, F>(seq: &[T], f: F) where T: Copy, F: Fn(T) { + for elt in seq { f(*elt); } } -fn map<T, U>(seq: &[T], f: |T| -> U) -> Vec<U> { +fn map<T, U, F>(seq: &[T], f: F) -> Vec<U> where T: Copy, U: Copy, F: Fn(T) -> U { let mut acc = vec![]; - for elt in seq.iter() { acc.push(f(elt)); } + for elt in seq { acc.push(f(*elt)); } acc } ``` Inside the function signature and body, the name of the type parameter can be -used as a type name. +used as a type name. [Trait](#traits) bounds can be specified for type parameters +to allow methods with that trait to be called on values of that type. This is +specified using the `where` syntax, as in the above example. When a generic function is referenced, its type is instantiated based on the context of the reference. For example, calling the `iter` function defined above on `[1, 2]` will instantiate type parameter `T` with `i32`, and require -the closure parameter to have type `fn(i32)`. +the closure parameter to have type `Fn(i32)`. The type parameters can also be explicitly supplied in a trailing [path](#paths) component after the function name. This might be necessary if there is not sufficient context to determine the type parameters. For example, `mem::size_of::<u32>() == 4`. -Since a parameter type is opaque to the generic function, the set of operations -that can be performed on it is limited. Values of parameter type can only be -moved, not copied. - -``` -fn id<T>(x: T) -> T { x } -``` - -Similarly, [trait](#traits) bounds can be specified for type parameters to -allow methods with that trait to be called on values of that type. - #### Unsafety Unsafe operations are those that potentially violate the memory-safety |
