Skip to content

Commit 7cef71f

Browse files
committed
---
yaml --- r: 124559 b: refs/heads/master c: 8859df7 h: refs/heads/master i: 124557: c749d72 124555: 57bb287 124551: 66eec27 124543: 97a6705 v: v3
1 parent d9d41fc commit 7cef71f

File tree

125 files changed

+1838
-993
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

125 files changed

+1838
-993
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 69127f2f4e467aa206727f431819c5ce98810887
2+
refs/heads/master: 8859df7fb5feecd7c397566fcb966c9afabbb7b2
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 9fc8394d3bce22ab483f98842434c84c396212ae
55
refs/heads/try: dff46952ab5c4567d1b5b35bfbd8befc45cdd38e

trunk/mk/docs.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ DOCS := index intro tutorial guide guide-ffi guide-macros guide-lifetimes \
3030
guide-tasks guide-container guide-pointers guide-testing \
3131
guide-runtime complement-bugreport \
3232
complement-lang-faq complement-design-faq complement-project-faq rust \
33-
rustdoc guide-unsafe
33+
rustdoc guide-unsafe guide-strings
3434

3535
PDF_DOCS := tutorial rust
3636

trunk/src/doc/guide-strings.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
% The Strings Guide
22

3-
# Strings
4-
53
Strings are an important concept to master in any programming language. If you
64
come from a managed language background, you may be surprised at the complexity
75
of string handling in a systems programming language. Efficient access and
@@ -14,7 +12,7 @@ Additionally, strings are not null-terminated and can contain null bytes.
1412

1513
Rust has two main types of strings: `&str` and `String`.
1614

17-
## &str
15+
# &str
1816

1917
The first kind is a `&str`. This is pronounced a 'string slice.' String literals
2018
are of the type `&str`:
@@ -38,7 +36,7 @@ Like vector slices, string slices are simply a pointer plus a length. This
3836
means that they're a 'view' into an already-allocated string, such as a
3937
`&'static str` or a `String`.
4038

41-
## String
39+
# String
4240

4341
A `String` is a heap-allocated string. This string is growable, and is also
4442
guaranteed to be UTF-8.
@@ -73,9 +71,9 @@ let x: &[u8] = &[b'a', b'b'];
7371
let stack_str: &str = str::from_utf8(x).unwrap();
7472
```
7573

76-
## Best Practices
74+
# Best Practices
7775

78-
### `String` vs. `&str`
76+
## `String` vs. `&str`
7977

8078
In general, you should prefer `String` when you need ownership, and `&str` when
8179
you just need to borrow a string. This is very similar to using `Vec<T>` vs. `&[T]`,
@@ -98,7 +96,7 @@ need, and it can make your lifetimes more complex. Furthermore, you can pass
9896
either kind of string into `foo` by using `.as_slice()` on any `String` you
9997
need to pass in, so the `&str` version is more flexible.
10098

101-
### Comparisons
99+
## Comparisons
102100

103101
To compare a String to a constant string, prefer `as_slice()`...
104102

@@ -123,7 +121,7 @@ fn compare(string: String) {
123121
Converting a `String` to a `&str` is cheap, but converting the `&str` to a
124122
`String` involves an allocation.
125123

126-
## Other Documentation
124+
# Other Documentation
127125

128126
* [the `&str` API documentation](/std/str/index.html)
129127
* [the `String` API documentation](std/string/index.html)

trunk/src/doc/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ li {list-style-type: none; }
1313

1414
# Guides
1515

16+
* [Strings](guide-strings.html)
1617
* [Pointers](guide-pointers.html)
1718
* [References and Lifetimes](guide-lifetimes.html)
1819
* [Containers and Iterators](guide-container.html)

trunk/src/doc/tutorial.md

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -716,8 +716,8 @@ When an enum has simple integer discriminators, you can apply the `as` cast
716716
operator to convert a variant to its discriminator value as an `int`:
717717

718718
~~~~
719-
# #[deriving(Show)] enum Direction { North }
720-
println!( "{} => {}", North, North as int );
719+
# enum Direction { North, East, South, West }
720+
println!( "North => {}", North as int );
721721
~~~~
722722

723723
It is possible to set the discriminator values to chosen constant values:
@@ -748,15 +748,23 @@ includes an identifier of the actual form that it holds, much like the
748748

749749
This declaration defines a type `Shape` that can refer to such shapes, and two
750750
functions, `Circle` and `Rectangle`, which can be used to construct values of
751-
the type. To create a new Circle, write `Circle(Point { x: 0.0, y: 0.0 },
752-
10.0)`.
751+
the type.
752+
753+
To create a new `Circle`, write:
754+
755+
~~~~
756+
# struct Point { x: f64, y: f64 }
757+
# enum Shape { Circle(Point, f64), Rectangle(Point, Point) }
758+
let circle = Circle(Point { x: 0.0, y: 0.0 }, 10.0);
759+
~~~~
753760

754761
All of these variant constructors may be used as patterns. The only way to
755762
access the contents of an enum instance is the destructuring of a match. For
756763
example:
757764

758765
~~~~
759766
use std::f64;
767+
760768
# struct Point {x: f64, y: f64}
761769
# enum Shape { Circle(Point, f64), Rectangle(Point, Point) }
762770
fn area(sh: Shape) -> f64 {
@@ -765,6 +773,9 @@ fn area(sh: Shape) -> f64 {
765773
Rectangle(Point { x, y }, Point { x: x2, y: y2 }) => (x2 - x) * (y2 - y)
766774
}
767775
}
776+
777+
let rect = Rectangle(Point { x: 0.0, y: 0.0 }, Point { x: 2.0, y: 2.0 });
778+
println!("area: {}", area(rect));
768779
~~~~
769780

770781
Use a lone `_` to ignore an individual field. Ignore all fields of a variant
@@ -786,8 +797,9 @@ fn point_from_direction(dir: Direction) -> Point {
786797
Enum variants may also be structs. For example:
787798

788799
~~~~
789-
# #![feature(struct_variant)]
800+
#![feature(struct_variant)]
790801
use std::f64;
802+
791803
# struct Point { x: f64, y: f64 }
792804
# fn square(x: f64) -> f64 { x * x }
793805
enum Shape {
@@ -802,7 +814,14 @@ fn area(sh: Shape) -> f64 {
802814
}
803815
}
804816
}
805-
# fn main() {}
817+
818+
fn main() {
819+
let rect = Rectangle {
820+
top_left: Point { x: 0.0, y: 0.0 },
821+
bottom_right: Point { x: 2.0, y: -2.0 }
822+
};
823+
println!("area: {}", area(rect));
824+
}
806825
~~~~
807826

808827
> *Note:* This feature of the compiler is currently gated behind the
@@ -986,6 +1005,10 @@ that are `Send`, but non-`Send` types can still *contain* types with custom
9861005
destructors. Example of types which are not `Send` are [`Gc<T>`][gc] and
9871006
[`Rc<T>`][rc], the shared-ownership types.
9881007

1008+
> *Note:* See a [later chapter](#ownership-escape-hatches) for a discussion about
1009+
> [`Gc<T>`][gc] and [`Rc<T>`][rc], and the [chapter about traits](#traits) for
1010+
> a discussion about `Send`.
1011+
9891012
[gc]: http://doc.rust-lang.org/std/gc/struct.Gc.html
9901013
[rc]: http://doc.rust-lang.org/std/rc/struct.Rc.html
9911014

@@ -1645,6 +1668,13 @@ let string = "foobar";
16451668
let view: &str = string.slice(0, 3);
16461669
~~~
16471670

1671+
Square brackets denote indexing into a slice or fixed-size vector:
1672+
1673+
~~~~
1674+
let crayons: [&str, ..3] = ["BananaMania", "Beaver", "Bittersweet"];
1675+
println!("Crayon 2 is '{}'", crayons[2]);
1676+
~~~~
1677+
16481678
Mutable slices also exist, just as there are mutable references. However, there
16491679
are no mutable string slices. Strings are a multi-byte encoding (UTF-8) of
16501680
Unicode code points, so they cannot be freely mutated without the ability to
@@ -1659,20 +1689,6 @@ view[0] = 5;
16591689
let ys: &mut [int] = &mut [1i, 2i, 3i];
16601690
~~~
16611691

1662-
Square brackets denote indexing into a slice or fixed-size vector:
1663-
1664-
~~~~
1665-
# enum Crayon { Almond, AntiqueBrass, Apricot,
1666-
# Aquamarine, Asparagus, AtomicTangerine,
1667-
# BananaMania, Beaver, Bittersweet };
1668-
# fn draw_scene(c: Crayon) { }
1669-
let crayons: [Crayon, ..3] = [BananaMania, Beaver, Bittersweet];
1670-
match crayons[0] {
1671-
Bittersweet => draw_scene(crayons[0]),
1672-
_ => ()
1673-
}
1674-
~~~~
1675-
16761692
A slice or fixed-size vector can be destructured using pattern matching:
16771693

16781694
~~~~
@@ -1738,6 +1754,8 @@ via dynamic checks and can fail at runtime.
17381754
The `Rc` and `Gc` types are not sendable, so they cannot be used to share memory between tasks. Safe
17391755
immutable and mutable shared memory is provided by the `sync::arc` module.
17401756

1757+
> *Note:* See a [later chapter](#traits) for a discussion about `Send` and sendable types.
1758+
17411759
# Closures
17421760

17431761
Named functions, like those we've seen so far, may not refer to local
@@ -2609,7 +2627,7 @@ let nonsense = mycircle.radius() * mycircle.area();
26092627
26102628
## Deriving implementations for traits
26112629

2612-
A small number of traits in `std` and `extra` can have implementations
2630+
A small number of traits in can have implementations
26132631
that can be automatically derived. These instances are specified by
26142632
placing the `deriving` attribute on a data type declaration. For
26152633
example, the following will mean that `Circle` has an implementation
@@ -2618,6 +2636,7 @@ of type `ABC` can be randomly generated and converted to a string:
26182636

26192637
~~~
26202638
extern crate rand;
2639+
use std::rand::{task_rng, Rng};
26212640
26222641
#[deriving(PartialEq)]
26232642
struct Circle { radius: f64 }
@@ -2628,6 +2647,13 @@ enum ABC { A, B, C }
26282647
fn main() {
26292648
// Use the Show trait to print "A, B, C."
26302649
println!("{}, {}, {}", A, B, C);
2650+
2651+
let mut rng = task_rng();
2652+
2653+
// Use the Rand trait to generate a random variants.
2654+
for _ in range(0i, 10) {
2655+
println!("{}", rng.gen::<ABC>());
2656+
}
26312657
}
26322658
~~~
26332659

@@ -3136,8 +3162,8 @@ In Rust terminology, we need a way to refer to other crates.
31363162
For that, Rust offers you the `extern crate` declaration:
31373163

31383164
~~~
3165+
// `num` ships with Rust.
31393166
extern crate num;
3140-
// `num` ships with Rust (much like `extra`; more details further down).
31413167
31423168
fn main() {
31433169
// The rational number '1/2':

trunk/src/liballoc/rc.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ fn main() {
148148
149149
*/
150150

151+
#![stable]
152+
151153
use core::mem::transmute;
152154
use core::cell::Cell;
153155
use core::clone::Clone;
@@ -171,6 +173,7 @@ struct RcBox<T> {
171173

172174
/// Immutable reference counted pointer type
173175
#[unsafe_no_drop_flag]
176+
#[stable]
174177
pub struct Rc<T> {
175178
// FIXME #12808: strange names to try to avoid interfering with
176179
// field accesses of the contained type via Deref
@@ -179,6 +182,7 @@ pub struct Rc<T> {
179182
_noshare: marker::NoShare
180183
}
181184

185+
#[stable]
182186
impl<T> Rc<T> {
183187
/// Construct a new reference-counted box
184188
pub fn new(value: T) -> Rc<T> {
@@ -203,6 +207,7 @@ impl<T> Rc<T> {
203207

204208
impl<T> Rc<T> {
205209
/// Downgrade the reference-counted pointer to a weak reference
210+
#[experimental = "Weak pointers may not belong in this module."]
206211
pub fn downgrade(&self) -> Weak<T> {
207212
self.inc_weak();
208213
Weak {
@@ -238,6 +243,7 @@ impl<T: Clone> Rc<T> {
238243
}
239244
}
240245

246+
#[experimental = "Deref is experimental."]
241247
impl<T> Deref<T> for Rc<T> {
242248
/// Borrow the value contained in the reference-counted box
243249
#[inline(always)]
@@ -247,6 +253,7 @@ impl<T> Deref<T> for Rc<T> {
247253
}
248254

249255
#[unsafe_destructor]
256+
#[experimental = "Drop is experimental."]
250257
impl<T> Drop for Rc<T> {
251258
fn drop(&mut self) {
252259
unsafe {
@@ -269,7 +276,7 @@ impl<T> Drop for Rc<T> {
269276
}
270277
}
271278

272-
#[unstable]
279+
#[unstable = "Clone is unstable."]
273280
impl<T> Clone for Rc<T> {
274281
#[inline]
275282
fn clone(&self) -> Rc<T> {
@@ -278,22 +285,26 @@ impl<T> Clone for Rc<T> {
278285
}
279286
}
280287

288+
#[stable]
281289
impl<T: Default> Default for Rc<T> {
282290
#[inline]
283291
fn default() -> Rc<T> {
284292
Rc::new(Default::default())
285293
}
286294
}
287295

296+
#[unstable = "PartialEq is unstable."]
288297
impl<T: PartialEq> PartialEq for Rc<T> {
289298
#[inline(always)]
290299
fn eq(&self, other: &Rc<T>) -> bool { **self == **other }
291300
#[inline(always)]
292301
fn ne(&self, other: &Rc<T>) -> bool { **self != **other }
293302
}
294303

304+
#[unstable = "Eq is unstable."]
295305
impl<T: Eq> Eq for Rc<T> {}
296306

307+
#[unstable = "PartialOrd is unstable."]
297308
impl<T: PartialOrd> PartialOrd for Rc<T> {
298309
#[inline(always)]
299310
fn partial_cmp(&self, other: &Rc<T>) -> Option<Ordering> {
@@ -313,11 +324,13 @@ impl<T: PartialOrd> PartialOrd for Rc<T> {
313324
fn ge(&self, other: &Rc<T>) -> bool { **self >= **other }
314325
}
315326

327+
#[unstable = "Ord is unstable."]
316328
impl<T: Ord> Ord for Rc<T> {
317329
#[inline]
318330
fn cmp(&self, other: &Rc<T>) -> Ordering { (**self).cmp(&**other) }
319331
}
320332

333+
#[experimental = "Show is experimental."]
321334
impl<T: fmt::Show> fmt::Show for Rc<T> {
322335
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
323336
(**self).fmt(f)
@@ -326,6 +339,7 @@ impl<T: fmt::Show> fmt::Show for Rc<T> {
326339

327340
/// Weak reference to a reference-counted box
328341
#[unsafe_no_drop_flag]
342+
#[experimental = "Weak pointers may not belong in this module."]
329343
pub struct Weak<T> {
330344
// FIXME #12808: strange names to try to avoid interfering with
331345
// field accesses of the contained type via Deref
@@ -334,6 +348,7 @@ pub struct Weak<T> {
334348
_noshare: marker::NoShare
335349
}
336350

351+
#[experimental = "Weak pointers may not belong in this module."]
337352
impl<T> Weak<T> {
338353
/// Upgrade a weak reference to a strong reference
339354
pub fn upgrade(&self) -> Option<Rc<T>> {
@@ -347,6 +362,7 @@ impl<T> Weak<T> {
347362
}
348363

349364
#[unsafe_destructor]
365+
#[experimental = "Weak pointers may not belong in this module."]
350366
impl<T> Drop for Weak<T> {
351367
fn drop(&mut self) {
352368
unsafe {
@@ -364,6 +380,7 @@ impl<T> Drop for Weak<T> {
364380
}
365381

366382
#[unstable]
383+
#[experimental = "Weak pointers may not belong in this module."]
367384
impl<T> Clone for Weak<T> {
368385
#[inline]
369386
fn clone(&self) -> Weak<T> {

0 commit comments

Comments
 (0)