@@ -297,7 +297,7 @@ the following forms:
297
297
num_lit : nonzero_dec [ dec_digit | '_' ] * num_suffix ?
298
298
| '0' [ [ dec_digit | '_' ] + num_suffix ?
299
299
| 'b' [ '1' | '0' | '_' ] + int_suffix ?
300
- | 'x' [ hex_digit | '- ' ] + int_suffix ? ] ;
300
+ | 'x' [ hex_digit | '_ ' ] + int_suffix ? ] ;
301
301
302
302
num_suffix : int_suffix | float_suffix ;
303
303
@@ -908,6 +908,11 @@ function defined above on `[1, 2]` will instantiate type parameter `T`
908
908
with ` int ` , and require the closure parameter to have type
909
909
` fn(int) ` .
910
910
911
+ The type parameters can also be explicitly supplied in a trailing
912
+ [ path] ( #paths ) component after the function name. This might be necessary
913
+ if there is not sufficient context to determine the type parameters. For
914
+ example, ` sys::size_of::<u32>() == 4 ` .
915
+
911
916
Since a parameter type is opaque to the generic function, the set of
912
917
operations that can be performed on it is limited. Values of parameter
913
918
type can always be moved, but they can only be copied when the
@@ -1085,6 +1090,15 @@ let p = Point(10, 11);
1085
1090
let px: int = match p { Point(x, _) => x };
1086
1091
~~~~
1087
1092
1093
+ A _ unit-like struct_ is a structure without any fields, defined by leaving off the fields list entirely.
1094
+ Such types will have a single value, just like the [ unit value ` () ` ] ( #unit-and-boolean-literals ) of the unit type.
1095
+ For example:
1096
+
1097
+ ~~~~
1098
+ struct Cookie;
1099
+ let c = [Cookie, Cookie, Cookie, Cookie];
1100
+ ~~~~
1101
+
1088
1102
### Enumerations
1089
1103
1090
1104
An _ enumeration_ is a simultaneous definition of a nominal [ enumerated type] ( #enumerated-types ) as well as a set of * constructors* ,
@@ -1130,22 +1144,23 @@ Constants are declared with the `const` keyword.
1130
1144
A constant item must have an expression giving its definition.
1131
1145
The definition expression of a constant is limited to expression forms that can be evaluated at compile time.
1132
1146
1133
- Constants must be explicitly typed. The type may be ``` bool ``` , ``` char ``` , a number, or a type derived from
1134
- those primitive types. The derived types are borrowed pointers, static arrays, tuples, and structs.
1147
+ Constants must be explicitly typed. The type may be ``` bool ``` , ``` char ``` , a number, or a type derived from those primitive types.
1148
+ The derived types are borrowed pointers, static arrays, tuples, and structs.
1149
+ Borrowed pointers must be have the ` 'static ` lifetime.
1135
1150
1136
1151
~~~~
1137
1152
const bit1: uint = 1 << 0;
1138
1153
const bit2: uint = 1 << 1;
1139
1154
1140
1155
const bits: [uint * 2] = [bit1, bit2];
1141
- const string: &str = "bitstring";
1156
+ const string: &'static str = "bitstring";
1142
1157
1143
1158
struct BitsNStrings {
1144
1159
mybits: [uint *2],
1145
- mystring: &str
1160
+ mystring: &'self str
1146
1161
}
1147
1162
1148
- const bits_n_strings: BitsNStrings = BitsNStrings {
1163
+ const bits_n_strings: BitsNStrings<'static> = BitsNStrings {
1149
1164
mybits: bits,
1150
1165
mystring: string
1151
1166
};
@@ -1285,19 +1300,22 @@ An _implementation_ is an item that implements a [trait](#traits) for a specific
1285
1300
Implementations are defined with the keyword ` impl ` .
1286
1301
1287
1302
~~~~
1288
- # type Point = {x: float, y: float};
1303
+ # struct Point {x: float, y: float};
1289
1304
# type Surface = int;
1290
- # type BoundingBox = {x: float, y: float, width: float, height: float};
1305
+ # struct BoundingBox {x: float, y: float, width: float, height: float};
1291
1306
# trait Shape { fn draw(Surface); fn bounding_box() -> BoundingBox; }
1292
1307
# fn do_draw_circle(s: Surface, c: Circle) { }
1293
1308
1294
- type Circle = {radius: float, center: Point};
1309
+ struct Circle {
1310
+ radius: float,
1311
+ center: Point,
1312
+ }
1295
1313
1296
1314
impl Shape for Circle {
1297
1315
fn draw(s: Surface) { do_draw_circle(s, self); }
1298
1316
fn bounding_box() -> BoundingBox {
1299
1317
let r = self.radius;
1300
- {x: self.center.x - r, y: self.center.y - r,
1318
+ BoundingBox {x: self.center.x - r, y: self.center.y - r,
1301
1319
width: 2.0 * r, height: 2.0 * r}
1302
1320
}
1303
1321
}
@@ -1343,7 +1361,7 @@ Functions within foreign modules are declared in the same way as other Rust func
1343
1361
with the exception that they may not have a body and are instead terminated by a semicolon.
1344
1362
1345
1363
~~~
1346
- # use libc::{c_char, FILE};
1364
+ # use core:: libc::{c_char, FILE};
1347
1365
# #[nolink]
1348
1366
1349
1367
extern mod c {
@@ -1590,7 +1608,8 @@ struct_expr : expr_path '{' ident ':' expr
1590
1608
[ ',' ident ':' expr ] *
1591
1609
[ ".." expr ] '}' |
1592
1610
expr_path '(' expr
1593
- [ ',' expr ] * ')'
1611
+ [ ',' expr ] * ')' |
1612
+ expr_path
1594
1613
~~~~~~~~
1595
1614
1596
1615
There are several forms of structure expressions.
@@ -1600,24 +1619,28 @@ providing the field values of a new instance of the structure.
1600
1619
A field name can be any identifier, and is separated from its value expression by a colon.
1601
1620
To indicate that a field is mutable, the ` mut ` keyword is written before its name.
1602
1621
1603
- A _ tuple structure expression_ constists of the [ path] ( #paths ) of a [ structure item] ( #structures ) ,
1622
+ A _ tuple structure expression_ consists of the [ path] ( #paths ) of a [ structure item] ( #structures ) ,
1604
1623
followed by a parenthesized list of one or more comma-separated expressions
1605
1624
(in other words, the path of a structured item followed by a tuple expression).
1606
1625
The structure item must be a tuple structure item.
1607
1626
1627
+ A _ unit-like structure expression_ consists only of the [ path] ( #paths ) of a [ structure item] ( #structures ) .
1628
+
1608
1629
The following are examples of structure expressions:
1609
1630
1610
1631
~~~~
1611
1632
# struct Point { x: float, y: float }
1612
1633
# struct TuplePoint(float, float);
1613
- # mod game { pub struct User { name: &str, age: uint, mut score: uint } }
1614
- # use game;
1634
+ # mod game { pub struct User<'self> { name: &'self str, age: uint, score: uint } }
1635
+ # struct Cookie; fn some_fn<T>(t: T) {}
1615
1636
Point {x: 10f, y: 20f};
1616
1637
TuplePoint(10f, 20f);
1617
- let u = game::User {name: "Joe", age: 35u, mut score: 100_000};
1638
+ let u = game::User {name: "Joe", age: 35u, score: 100_000};
1639
+ some_fn::<Cookie>(Cookie);
1618
1640
~~~~
1619
1641
1620
1642
A structure expression forms a new value of the named structure type.
1643
+ Note that for a given * unit-like* structure type, this will always be the same value.
1621
1644
1622
1645
A structure expression can terminate with the syntax ` .. ` followed by an expression to denote a functional update.
1623
1646
The expression following ` .. ` (the base) must be of the same structure type as the new structure type being formed.
@@ -1638,38 +1661,6 @@ rec_expr : '{' ident ':' expr
1638
1661
[ ".." expr ] '}'
1639
1662
~~~~~~~~
1640
1663
1641
- > ** Note:** In future versions of Rust, record expressions and [ record types] ( #record-types ) will be removed.
1642
-
1643
- A [ _ record_ ] ( #record-types ) _ expression_ is one or more comma-separated
1644
- name-value pairs enclosed by braces. A fieldname can be any identifier,
1645
- and is separated from its value expression by a
1646
- colon. To indicate that a field is mutable, the ` mut ` keyword is
1647
- written before its name.
1648
-
1649
- ~~~~
1650
- {x: 10f, y: 20f};
1651
- {name: "Joe", age: 35u, score: 100_000};
1652
- {ident: "X", mut count: 0u};
1653
- ~~~~
1654
-
1655
- The order of the fields in a record expression is significant, and
1656
- determines the type of the resulting value. ` {a: u8, b: u8} ` and `{b:
1657
- u8, a: u8}` are two different fields.
1658
-
1659
- A record expression can terminate with the syntax ` .. ` followed by an
1660
- expression to denote a functional update. The expression following
1661
- ` .. ` (the base) must be of a record type that includes at least all the
1662
- fields mentioned in the record expression. A new record will be
1663
- created, of the same type as the base expression, with the given
1664
- values for the fields that were explicitly specified, and the values
1665
- in the base record for all other fields. The ordering of the fields in
1666
- such a record expression is not significant.
1667
-
1668
- ~~~~
1669
- let base = {x: 1, y: 2, z: 3};
1670
- {y: 0, z: 10, .. base};
1671
- ~~~~
1672
-
1673
1664
### Method-call expressions
1674
1665
1675
1666
~~~~~~~~ {.ebnf .gram}
@@ -1690,7 +1681,7 @@ field_expr : expr '.' ident
1690
1681
1691
1682
A _ field expression_ consists of an expression followed by a single dot and an identifier,
1692
1683
when not immediately followed by a parenthesized expression-list (the latter is a [ method call expression] ( #method-call-expressions ) ).
1693
- A field expression denotes a field of a [ structure] ( #structure-types ) or [ record ] ( #record-types ) .
1684
+ A field expression denotes a field of a [ structure] ( #structure-types ) .
1694
1685
1695
1686
~~~~~~~~ {.field}
1696
1687
myrecord.myfield;
@@ -1906,8 +1897,10 @@ An example of three different swap expressions:
1906
1897
# let mut x = &mut [0];
1907
1898
# let mut a = &mut [0];
1908
1899
# let i = 0;
1909
- # let y = {mut z: 0};
1910
- # let b = {mut c: 0};
1900
+ # struct S1 { z: int };
1901
+ # struct S2 { c: int };
1902
+ # let mut y = S1{z: 0};
1903
+ # let mut b = S2{c: 0};
1911
1904
1912
1905
x <-> a;
1913
1906
x[i] <-> a[i];
@@ -2041,12 +2034,14 @@ an optional reference slot to serve as the function's output, bound to the
2041
2034
` lval ` on the right hand side of the call. If the function eventually returns,
2042
2035
then the expression completes.
2043
2036
2044
- An example of a call expression :
2037
+ Some examples of call expressions :
2045
2038
2046
2039
~~~~
2047
2040
# fn add(x: int, y: int) -> int { 0 }
2041
+ # use core::from_str::FromStr::from_str;
2048
2042
2049
2043
let x: int = add(1, 2);
2044
+ let pi = from_str::<f32>("3.14");
2050
2045
~~~~
2051
2046
2052
2047
### Lambda expressions
@@ -2329,42 +2324,6 @@ match x {
2329
2324
}
2330
2325
~~~~
2331
2326
2332
- Records and structures can also be pattern-matched and their fields bound to variables.
2333
- When matching fields of a record,
2334
- the fields being matched are specified first,
2335
- then a placeholder (` _ ` ) represents the remaining fields.
2336
-
2337
- ~~~~
2338
- # type options = {choose: bool, size: ~str};
2339
- # type player = {player: ~str, stats: (), options: options};
2340
- # fn load_stats() { }
2341
- # fn choose_player(r: &player) { }
2342
- # fn next_player() { }
2343
-
2344
- fn main() {
2345
- let r = {
2346
- player: ~"ralph",
2347
- stats: load_stats(),
2348
- options: {
2349
- choose: true,
2350
- size: ~"small"
2351
- }
2352
- };
2353
-
2354
- match r {
2355
- {options: {choose: true, _}, _} => {
2356
- choose_player(&r)
2357
- }
2358
- {player: ref p, options: {size: ~"small", _}, _} => {
2359
- log(info, (copy *p) + ~" is small");
2360
- }
2361
- _ => {
2362
- next_player();
2363
- }
2364
- }
2365
- }
2366
- ~~~~
2367
-
2368
2327
Patterns that bind variables default to binding to a copy of the matched value. This can be made
2369
2328
explicit using the ``` copy ``` keyword, changed to bind to a borrowed pointer by using the ``` ref ```
2370
2329
keyword, or to a mutable borrowed pointer using ``` ref mut ``` , or the value can be moved into
@@ -2598,8 +2557,8 @@ order specified by the tuple type.
2598
2557
An example of a tuple type and its use:
2599
2558
2600
2559
~~~~
2601
- type Pair = (int,&str);
2602
- let p: Pair = (10,"hello");
2560
+ type Pair<'self> = (int,&'self str);
2561
+ let p: Pair<'static> = (10,"hello");
2603
2562
let (a, b) = p;
2604
2563
assert b != "world";
2605
2564
~~~~
@@ -2644,7 +2603,10 @@ the resulting `struct` value will always be laid out in memory in the order spec
2644
2603
The fields of a ` struct ` may be qualified by [ visibility modifiers] ( #visibility-modifiers ) ,
2645
2604
to restrict access to implementation-private data in a structure.
2646
2605
2647
- A ` tuple struct ` type is just like a structure type, except that the fields are anonymous.
2606
+ A _ tuple struct_ type is just like a structure type, except that the fields are anonymous.
2607
+
2608
+ A _ unit-like struct_ type is like a structure type, except that it has no fields.
2609
+ The one value constructed by the associated [ structure expression] ( #structure-expression ) is the only value that inhabits such a type.
2648
2610
2649
2611
### Enumerated types
2650
2612
@@ -2693,25 +2655,6 @@ let a: List<int> = Cons(7, @Cons(13, @Nil));
2693
2655
~~~~
2694
2656
2695
2657
2696
- ### Record types
2697
-
2698
- > ** Note:** Records are not nominal types, thus do not directly support recursion, visibility control,
2699
- > out-of-order field initialization, or coherent trait implementation.
2700
- > Records are therefore deprecated and will be removed in future versions of Rust.
2701
- > [ Structure types] ( #structure-types ) should be used instead.
2702
-
2703
- The record type-constructor forms a new heterogeneous product of values.
2704
- Fields of a record type are accessed by name and are arranged in memory in the order specified by the record type.
2705
-
2706
- An example of a record type and its use:
2707
-
2708
- ~~~~
2709
- type Point = {x: int, y: int};
2710
- let p: Point = {x: 10, y: 11};
2711
- let px: int = p.x;
2712
- ~~~~
2713
-
2714
-
2715
2658
### Pointer types
2716
2659
2717
2660
All pointers in Rust are explicit first-class values.
@@ -2776,7 +2719,7 @@ fn add(x: int, y: int) -> int {
2776
2719
2777
2720
let mut x = add(5,7);
2778
2721
2779
- type Binop = fn(int,int) -> int;
2722
+ type Binop<'self> = &'self fn(int,int) -> int;
2780
2723
let bo: Binop = add;
2781
2724
x = bo(5,7);
2782
2725
~~~~~~~~
@@ -3041,7 +2984,8 @@ Some operations (such as field selection) implicitly dereference boxes. An
3041
2984
example of an _ implicit dereference_ operation performed on box values:
3042
2985
3043
2986
~~~~~~~~
3044
- let x = @{y: 10};
2987
+ struct Foo { y: int }
2988
+ let x = @Foo{y: 10};
3045
2989
assert x.y == 10;
3046
2990
~~~~~~~~
3047
2991
0 commit comments