Skip to content

Commit d03addf

Browse files
committed
---
yaml --- r: 153590 b: refs/heads/try2 c: c4dd47d h: refs/heads/master v: v3
1 parent c617d6d commit d03addf

File tree

129 files changed

+2048
-1002
lines changed

Some content is hidden

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

129 files changed

+2048
-1002
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 20df4ccafe4d3eb588fa309f06d41aa6b5b1d526
8+
refs/heads/try2: c4dd47df3477b224f0bf8d89a48f1ce57ec0dbd7
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/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

branches/try2/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)

branches/try2/src/doc/guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ arguments we pass to functions and macros, if you're passing more than one.
583583
When you just use the double curly braces, Rust will attempt to display the
584584
value in a meaningful way by checking out its type. If you want to specify the
585585
format in a more detailed manner, there are a [wide number of options
586-
available](/std/fmt/index.html). Fow now, we'll just stick to the default:
586+
available](/std/fmt/index.html). For now, we'll just stick to the default:
587587
integers aren't very complicated to print.
588588

589589
So, we've cleared up all of the confusion around bindings, with one exception:

branches/try2/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)

branches/try2/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':

branches/try2/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)