about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Rosenberg <42micro@gmail.com>2015-04-23 20:33:46 -0400
committerMichael Rosenberg <42micro@gmail.com>2015-04-23 20:33:46 -0400
commit352838ed349d01ae16408221bc6a327bf3651ef2 (patch)
tree5b55f62e66bcf67cd2d8f00f4c02b06ba682970c
parent90bed3f9479f9f63746f227d5fc4ddecdd37642a (diff)
downloadrust-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.md25
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