@@ -2814,23 +2814,271 @@ By just bringing the module into scope, we can keep one level of namespacing.
2814
2814
2815
2815
# Pointers
2816
2816
2817
+ In systems programming, pointers are an incredibly important topic. Rust has a
2818
+ very rich set of pointers, and they operate differently than in many other
2819
+ languages. They are important enough that we have a specific [ Pointer
2820
+ Guide] ( /guide-pointers.html ) that goes into pointers in much detail. In fact,
2821
+ while you're currently reading this guide, which covers the language in broad
2822
+ overview, there are a number of other guides that put a specific topic under a
2823
+ microscope. You can find the list of guides on the [ documentation index
2824
+ page] ( /index.html#guides ) .
2825
+
2826
+ In this section, we'll assume that you're familiar with pointers as a general
2827
+ concept. If you aren't, please read the [ introduction to
2828
+ pointers] ( /guide-pointers.html#an-introduction ) section of the Pointer Guide,
2829
+ and then come back here. We'll wait.
2830
+
2831
+ Got the gist? Great. Let's talk about pointers in Rust.
2832
+
2833
+ ## References
2834
+
2835
+ The most primitive form of pointer in Rust is called a ** reference** .
2836
+ References are created using the ampersand (` & ` ). Here's a simple
2837
+ reference:
2838
+
2839
+ ``` {rust}
2840
+ let x = 5i;
2841
+ let y = &x;
2842
+ ```
2843
+
2844
+ ` y ` is a reference to ` x ` . To dereference (get the value being referred to
2845
+ rather than the reference itself) ` y ` , we use the asterisk (` * ` ):
2846
+
2847
+ ``` {rust}
2848
+ let x = 5i;
2849
+ let y = &x;
2850
+
2851
+ assert_eq!(5i, *y);
2852
+ ```
2853
+
2854
+ Like any ` let ` binding, references are immutable by default.
2855
+
2856
+ You can declare that functions take a reference:
2857
+
2858
+ ``` {rust}
2859
+ fn add_one(x: &int) -> int { *x + 1 }
2860
+
2861
+ fn main() {
2862
+ assert_eq!(6, add_one(&5));
2863
+ }
2864
+ ```
2865
+
2866
+ As you can see, we can make a reference from a literal by applying ` & ` as well.
2867
+ Of course, in this simple function, there's not a lot of reason to take ` x ` by
2868
+ reference. It's just an example of the syntax.
2869
+
2870
+ Because references are immutable, you can have multiple references that
2871
+ ** alias** (point to the same place):
2872
+
2873
+ ``` {rust}
2874
+ let x = 5i;
2875
+ let y = &x;
2876
+ let z = &x;
2877
+ ```
2878
+
2879
+ We can make a mutable reference by using ` &mut ` instead of ` & ` :
2880
+
2881
+ ``` {rust}
2882
+ let mut x = 5i;
2883
+ let y = &mut x;
2884
+ ```
2885
+
2886
+ Note that ` x ` must also be mutable. If it isn't, like this:
2887
+
2888
+ ``` {rust,ignore}
2889
+ let x = 5i;
2890
+ let y = &mut x;
2891
+ ```
2892
+
2893
+ Rust will complain:
2894
+
2895
+ ``` {ignore,notrust}
2896
+ 6:19 error: cannot borrow immutable local variable `x` as mutable
2897
+ let y = &mut x;
2898
+ ^
2899
+ ```
2900
+
2901
+ We don't want a mutable reference to immutable data! This error message uses a
2902
+ term we haven't talked about yet, 'borrow.' We'll get to that in just a moment.
2903
+
2904
+ This simple example actually illustrates a lot of Rust's power: Rust has
2905
+ prevented us, at compile time, from breaking our own rules. Because Rust's
2906
+ references check these kinds of rules entirely at compile time, there's no
2907
+ runtime overhead for this safety. At runtime, these are the same as a raw
2908
+ machine pointer, like in C or C++. We've just double-checked ahead of time
2909
+ that we haven't done anything dangerous.
2910
+
2911
+ Rust will also prevent us from creating two mutable references that alias.
2912
+ This won't work:
2913
+
2914
+ ``` {rust,ignore}
2915
+ let mut x = 5i;
2916
+ let y = &mut x;
2917
+ let z = &mut x;
2918
+ ```
2919
+
2920
+ It gives us this error:
2921
+
2922
+ ``` {notrust,ignore}
2923
+ error: cannot borrow `x` as mutable more than once at a time
2924
+ let z = &mut x;
2925
+ ^
2926
+ note: previous borrow of `x` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `x` until the borrow ends
2927
+ let y = &mut x;
2928
+ ^
2929
+ note: previous borrow ends here
2930
+ fn main() {
2931
+ let mut x = 5i;
2932
+ let y = &mut x;
2933
+ let z = &mut x;
2934
+ }
2935
+ ^
2936
+ ```
2937
+
2938
+ This is a big error message. Let's dig into it for a moment. There are three
2939
+ parts: the error and two notes. The error says what we expected, we cannot have
2940
+ two pointers that point to the same memory.
2941
+
2942
+ The two notes give some extra context. Rust's error messages often contain this
2943
+ kind of extra information when the error is complex. Rust is telling us two
2944
+ things: first, that the reason we cannot ** borrow** ` x ` as ` z ` is that we
2945
+ previously borrowed ` x ` as ` y ` . The second note shows where ` y ` 's borrowing
2946
+ ends.
2947
+
2948
+ Wait, borrowing?
2949
+
2950
+ In order to truly understand this error, we have to learn a few new concepts:
2951
+ ** ownership** , ** borrowing** , and ** lifetimes** .
2952
+
2953
+ ## Ownership, borrowing, and lifetimes
2954
+
2955
+ ## Boxes
2956
+
2957
+ All of our references so far have been to variables we've created on the stack.
2958
+ In Rust, the simplest way to allocate heap variables is using a * box* . To
2959
+ create a box, use the ` box ` keyword:
2960
+
2961
+ ``` {rust}
2962
+ let x = box 5i;
2963
+ ```
2964
+
2965
+ This allocates an integer ` 5 ` on the heap, and creates a binding ` x ` that
2966
+ refers to it.. The great thing about boxed pointers is that we don't have to
2967
+ manually free this allocation! If we write
2968
+
2969
+ ``` {rust}
2970
+ {
2971
+ let x = box 5i;
2972
+ // do stuff
2973
+ }
2974
+ ```
2975
+
2976
+ then Rust will automatically free ` x ` at the end of the block. This isn't
2977
+ because Rust has a garbage collector -- it doesn't. Instead, Rust uses static
2978
+ analysis to determine the * lifetime* of ` x ` , and then generates code to free it
2979
+ once it's sure the ` x ` won't be used again. This Rust code will do the same
2980
+ thing as the following C code:
2981
+
2982
+ ``` {c,ignore}
2983
+ {
2984
+ int *x = (int *)malloc(sizeof(int));
2985
+ // do stuff
2986
+ free(x);
2987
+ }
2988
+ ```
2989
+
2990
+ This means we get the benefits of manual memory management, but the compiler
2991
+ ensures that we don't do something wrong. We can't forget to ` free ` our memory.
2992
+
2993
+ Boxes are the sole owner of their contents, so you cannot take a mutable
2994
+ reference to them and then use the original box:
2995
+
2996
+ ``` {rust,ignore}
2997
+ let mut x = box 5i;
2998
+ let y = &mut x;
2999
+
3000
+ *x; // you might expect 5, but this is actually an error
3001
+ ```
3002
+
3003
+ This gives us this error:
3004
+
3005
+ ``` {notrust,ignore}
3006
+ 8:7 error: cannot use `*x` because it was mutably borrowed
3007
+ *x;
3008
+ ^~
3009
+ 6:19 note: borrow of `x` occurs here
3010
+ let y = &mut x;
3011
+ ^
3012
+ ```
3013
+
3014
+ As long as ` y ` is borrowing the contents, we cannot use ` x ` . After ` y ` is
3015
+ done borrowing the value, we can use it again. This works fine:
3016
+
3017
+ ``` {rust}
3018
+ let mut x = box 5i;
3019
+
3020
+ {
3021
+ let y = &mut x;
3022
+ } // y goes out of scope at the end of the block
3023
+
3024
+ *x;
3025
+ ```
3026
+
3027
+ ## Rc and Arc
3028
+
3029
+ Sometimes, you need to allocate something on the heap, but give out multiple
3030
+ references to the memory. Rust's ` Rc<T> ` (pronounced 'arr cee tee') and
3031
+ ` Arc<T> ` types (again, the ` T ` is for generics, we'll learn more later) provide
3032
+ you with this ability. ** Rc** stands for 'reference counted,' and ** Arc** for
3033
+ 'atomically reference counted.' This is how Rust keeps track of the multiple
3034
+ owners: every time we make a new reference to the ` Rc<T> ` , we add one to its
3035
+ internal 'reference count.' Every time a reference goes out of scope, we
3036
+ subtract one from the count. When the count is zero, the ` Rc<T> ` can be safely
3037
+ deallocated. ` Arc<T> ` is almost identical to ` Rc<T> ` , except for one thing: The
3038
+ 'atomically' in 'Arc' means that increasing and decreasing the count uses a
3039
+ thread-safe mechanism to do so. Why two types? ` Rc<T> ` is faster, so if you're
3040
+ not in a multi-threaded scenario, you can have that advantage. Since we haven't
3041
+ talked about threading yet in Rust, we'll show you ` Rc<T> ` for the rest of this
3042
+ section.
3043
+
3044
+ To create an ` Rc<T> ` , use ` Rc::new() ` :
3045
+
3046
+ ``` {rust}
3047
+ use std::rc::Rc;
3048
+
3049
+ let x = Rc::new(5i);
3050
+ ```
3051
+
3052
+ To create a second reference, use the ` .clone() ` method:
3053
+
3054
+ ``` {rust}
3055
+ use std::rc::Rc;
3056
+
3057
+ let x = Rc::new(5i);
3058
+ let y = x.clone();
3059
+ ```
3060
+
3061
+ The ` Rc<T> ` will live as long as any of its references are alive. After they
3062
+ all go out of scope, the memory will be ` free ` d.
3063
+
3064
+ If you use ` Rc<T> ` or ` Arc<T> ` , you have to be careful about introducing
3065
+ cycles. If you have two ` Rc<T> ` s that point to each other, the reference counts
3066
+ will never drop to zero, and you'll have a memory leak. To learn more, check
3067
+ out [ the section on ` Rc<T> ` and ` Arc<T> ` in the pointers
3068
+ guide] ( http://doc.rust-lang.org/guide-pointers.html#rc-and-arc ) .
3069
+
3070
+ # Patterns
3071
+
2817
3072
# Lambdas
2818
3073
2819
3074
# iterators
2820
3075
2821
-
2822
3076
# Generics
2823
3077
2824
3078
# Traits
2825
3079
2826
3080
# Operators and built-in Traits
2827
3081
2828
- # Ownership and Lifetimes
2829
-
2830
- Move vs. Copy
2831
-
2832
- Allocation
2833
-
2834
3082
# Tasks
2835
3083
2836
3084
# Macros
0 commit comments