@@ -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* ,
@@ -1285,19 +1299,22 @@ An _implementation_ is an item that implements a [trait](#traits) for a specific
1285
1299
Implementations are defined with the keyword ` impl ` .
1286
1300
1287
1301
~~~~
1288
- # type Point = {x: float, y: float};
1302
+ # struct Point {x: float, y: float};
1289
1303
# type Surface = int;
1290
- # type BoundingBox = {x: float, y: float, width: float, height: float};
1304
+ # struct BoundingBox {x: float, y: float, width: float, height: float};
1291
1305
# trait Shape { fn draw(Surface); fn bounding_box() -> BoundingBox; }
1292
1306
# fn do_draw_circle(s: Surface, c: Circle) { }
1293
1307
1294
- type Circle = {radius: float, center: Point};
1308
+ struct Circle {
1309
+ radius: float,
1310
+ center: Point,
1311
+ }
1295
1312
1296
1313
impl Shape for Circle {
1297
1314
fn draw(s: Surface) { do_draw_circle(s, self); }
1298
1315
fn bounding_box() -> BoundingBox {
1299
1316
let r = self.radius;
1300
- {x: self.center.x - r, y: self.center.y - r,
1317
+ BoundingBox {x: self.center.x - r, y: self.center.y - r,
1301
1318
width: 2.0 * r, height: 2.0 * r}
1302
1319
}
1303
1320
}
@@ -1590,7 +1607,8 @@ struct_expr : expr_path '{' ident ':' expr
1590
1607
[ ',' ident ':' expr ] *
1591
1608
[ ".." expr ] '}' |
1592
1609
expr_path '(' expr
1593
- [ ',' expr ] * ')'
1610
+ [ ',' expr ] * ')' |
1611
+ expr_path
1594
1612
~~~~~~~~
1595
1613
1596
1614
There are several forms of structure expressions.
@@ -1600,23 +1618,28 @@ providing the field values of a new instance of the structure.
1600
1618
A field name can be any identifier, and is separated from its value expression by a colon.
1601
1619
To indicate that a field is mutable, the ` mut ` keyword is written before its name.
1602
1620
1603
- A _ tuple structure expression_ constists of the [ path] ( #paths ) of a [ structure item] ( #structures ) ,
1621
+ A _ tuple structure expression_ consists of the [ path] ( #paths ) of a [ structure item] ( #structures ) ,
1604
1622
followed by a parenthesized list of one or more comma-separated expressions
1605
1623
(in other words, the path of a structured item followed by a tuple expression).
1606
1624
The structure item must be a tuple structure item.
1607
1625
1626
+ A _ unit-like structure expression_ consists only of the [ path] ( #paths ) of a [ structure item] ( #structures ) .
1627
+
1608
1628
The following are examples of structure expressions:
1609
1629
1610
1630
~~~~
1611
1631
# struct Point { x: float, y: float }
1612
1632
# struct TuplePoint(float, float);
1613
1633
# mod game { pub struct User { name: &str, age: uint, score: uint } }
1634
+ # struct Cookie; fn some_fn<T>(t: T) {}
1614
1635
Point {x: 10f, y: 20f};
1615
1636
TuplePoint(10f, 20f);
1616
1637
let u = game::User {name: "Joe", age: 35u, score: 100_000};
1638
+ some_fn::<Cookie>(Cookie);
1617
1639
~~~~
1618
1640
1619
1641
A structure expression forms a new value of the named structure type.
1642
+ Note that for a given * unit-like* structure type, this will always be the same value.
1620
1643
1621
1644
A structure expression can terminate with the syntax ` .. ` followed by an expression to denote a functional update.
1622
1645
The expression following ` .. ` (the base) must be of the same structure type as the new structure type being formed.
@@ -1637,38 +1660,6 @@ rec_expr : '{' ident ':' expr
1637
1660
[ ".." expr ] '}'
1638
1661
~~~~~~~~
1639
1662
1640
- > ** Note:** In future versions of Rust, record expressions and [ record types] ( #record-types ) will be removed.
1641
-
1642
- A [ _ record_ ] ( #record-types ) _ expression_ is one or more comma-separated
1643
- name-value pairs enclosed by braces. A fieldname can be any identifier,
1644
- and is separated from its value expression by a
1645
- colon. To indicate that a field is mutable, the ` mut ` keyword is
1646
- written before its name.
1647
-
1648
- ~~~~
1649
- {x: 10f, y: 20f};
1650
- {name: "Joe", age: 35u, score: 100_000};
1651
- {ident: "X", mut count: 0u};
1652
- ~~~~
1653
-
1654
- The order of the fields in a record expression is significant, and
1655
- determines the type of the resulting value. ` {a: u8, b: u8} ` and `{b:
1656
- u8, a: u8}` are two different fields.
1657
-
1658
- A record expression can terminate with the syntax ` .. ` followed by an
1659
- expression to denote a functional update. The expression following
1660
- ` .. ` (the base) must be of a record type that includes at least all the
1661
- fields mentioned in the record expression. A new record will be
1662
- created, of the same type as the base expression, with the given
1663
- values for the fields that were explicitly specified, and the values
1664
- in the base record for all other fields. The ordering of the fields in
1665
- such a record expression is not significant.
1666
-
1667
- ~~~~
1668
- let base = {x: 1, y: 2, z: 3};
1669
- {y: 0, z: 10, .. base};
1670
- ~~~~
1671
-
1672
1663
### Method-call expressions
1673
1664
1674
1665
~~~~~~~~ {.ebnf .gram}
@@ -1689,7 +1680,7 @@ field_expr : expr '.' ident
1689
1680
1690
1681
A _ field expression_ consists of an expression followed by a single dot and an identifier,
1691
1682
when not immediately followed by a parenthesized expression-list (the latter is a [ method call expression] ( #method-call-expressions ) ).
1692
- A field expression denotes a field of a [ structure] ( #structure-types ) or [ record ] ( #record-types ) .
1683
+ A field expression denotes a field of a [ structure] ( #structure-types ) .
1693
1684
1694
1685
~~~~~~~~ {.field}
1695
1686
myrecord.myfield;
@@ -1905,8 +1896,10 @@ An example of three different swap expressions:
1905
1896
# let mut x = &mut [0];
1906
1897
# let mut a = &mut [0];
1907
1898
# let i = 0;
1908
- # let y = {mut z: 0};
1909
- # let b = {mut c: 0};
1899
+ # struct S1 { z: int };
1900
+ # struct S2 { c: int };
1901
+ # let mut y = S1{z: 0};
1902
+ # let mut b = S2{c: 0};
1910
1903
1911
1904
x <-> a;
1912
1905
x[i] <-> a[i];
@@ -2040,12 +2033,14 @@ an optional reference slot to serve as the function's output, bound to the
2040
2033
` lval ` on the right hand side of the call. If the function eventually returns,
2041
2034
then the expression completes.
2042
2035
2043
- An example of a call expression :
2036
+ Some examples of call expressions :
2044
2037
2045
2038
~~~~
2046
2039
# fn add(x: int, y: int) -> int { 0 }
2040
+ # use core::from_str::FromStr::from_str;
2047
2041
2048
2042
let x: int = add(1, 2);
2043
+ let pi = from_str::<f32>("3.14");
2049
2044
~~~~
2050
2045
2051
2046
### Lambda expressions
@@ -2328,42 +2323,6 @@ match x {
2328
2323
}
2329
2324
~~~~
2330
2325
2331
- Records and structures can also be pattern-matched and their fields bound to variables.
2332
- When matching fields of a record,
2333
- the fields being matched are specified first,
2334
- then a placeholder (` _ ` ) represents the remaining fields.
2335
-
2336
- ~~~~
2337
- # type options = {choose: bool, size: ~str};
2338
- # type player = {player: ~str, stats: (), options: options};
2339
- # fn load_stats() { }
2340
- # fn choose_player(r: &player) { }
2341
- # fn next_player() { }
2342
-
2343
- fn main() {
2344
- let r = {
2345
- player: ~"ralph",
2346
- stats: load_stats(),
2347
- options: {
2348
- choose: true,
2349
- size: ~"small"
2350
- }
2351
- };
2352
-
2353
- match r {
2354
- {options: {choose: true, _}, _} => {
2355
- choose_player(&r)
2356
- }
2357
- {player: ref p, options: {size: ~"small", _}, _} => {
2358
- log(info, (copy *p) + ~" is small");
2359
- }
2360
- _ => {
2361
- next_player();
2362
- }
2363
- }
2364
- }
2365
- ~~~~
2366
-
2367
2326
Patterns that bind variables default to binding to a copy of the matched value. This can be made
2368
2327
explicit using the ``` copy ``` keyword, changed to bind to a borrowed pointer by using the ``` ref ```
2369
2328
keyword, or to a mutable borrowed pointer using ``` ref mut ``` , or the value can be moved into
@@ -2643,7 +2602,10 @@ the resulting `struct` value will always be laid out in memory in the order spec
2643
2602
The fields of a ` struct ` may be qualified by [ visibility modifiers] ( #visibility-modifiers ) ,
2644
2603
to restrict access to implementation-private data in a structure.
2645
2604
2646
- A ` tuple struct ` type is just like a structure type, except that the fields are anonymous.
2605
+ A _ tuple struct_ type is just like a structure type, except that the fields are anonymous.
2606
+
2607
+ A _ unit-like struct_ type is like a structure type, except that it has no fields.
2608
+ The one value constructed by the associated [ structure expression] ( #structure-expression ) is the only value that inhabits such a type.
2647
2609
2648
2610
### Enumerated types
2649
2611
@@ -2692,25 +2654,6 @@ let a: List<int> = Cons(7, @Cons(13, @Nil));
2692
2654
~~~~
2693
2655
2694
2656
2695
- ### Record types
2696
-
2697
- > ** Note:** Records are not nominal types, thus do not directly support recursion, visibility control,
2698
- > out-of-order field initialization, or coherent trait implementation.
2699
- > Records are therefore deprecated and will be removed in future versions of Rust.
2700
- > [ Structure types] ( #structure-types ) should be used instead.
2701
-
2702
- The record type-constructor forms a new heterogeneous product of values.
2703
- Fields of a record type are accessed by name and are arranged in memory in the order specified by the record type.
2704
-
2705
- An example of a record type and its use:
2706
-
2707
- ~~~~
2708
- type Point = {x: int, y: int};
2709
- let p: Point = {x: 10, y: 11};
2710
- let px: int = p.x;
2711
- ~~~~
2712
-
2713
-
2714
2657
### Pointer types
2715
2658
2716
2659
All pointers in Rust are explicit first-class values.
@@ -3040,7 +2983,8 @@ Some operations (such as field selection) implicitly dereference boxes. An
3040
2983
example of an _ implicit dereference_ operation performed on box values:
3041
2984
3042
2985
~~~~~~~~
3043
- let x = @{y: 10};
2986
+ struct Foo { y: int }
2987
+ let x = @Foo{y: 10};
3044
2988
assert x.y == 10;
3045
2989
~~~~~~~~
3046
2990
0 commit comments