@@ -2070,38 +2070,6 @@ The currently implemented features of the compiler are:
2070
2070
closure as ` once ` is unlikely to be supported going forward. So
2071
2071
they are hidden behind this feature until they are to be removed.
2072
2072
2073
- * ` managed_boxes ` - Usage of ` @ ` pointers is gated due to many
2074
- planned changes to this feature. In the past, this has meant
2075
- "a GC pointer", but the current implementation uses
2076
- reference counting and will likely change drastically over
2077
- time. Additionally, the ` @ ` syntax will no longer be used to
2078
- create GC boxes.
2079
-
2080
- * ` asm ` - The ` asm! ` macro provides a means for inline assembly. This is often
2081
- useful, but the exact syntax for this feature along with its semantics
2082
- are likely to change, so this macro usage must be opted into.
2083
-
2084
- * ` non_ascii_idents ` - The compiler supports the use of non-ascii identifiers,
2085
- but the implementation is a little rough around the
2086
- edges, so this can be seen as an experimental feature for
2087
- now until the specification of identifiers is fully
2088
- fleshed out.
2089
-
2090
- * ` thread_local ` - The usage of the ` #[thread_local] ` attribute is experimental
2091
- and should be seen as unstable. This attribute is used to
2092
- declare a ` static ` as being unique per-thread leveraging
2093
- LLVM's implementation which works in concert with the kernel
2094
- loader and dynamic linker. This is not necessarily available
2095
- on all platforms, and usage of it is discouraged (rust
2096
- focuses more on task-local data instead of thread-local
2097
- data).
2098
-
2099
- * ` link_args ` - This attribute is used to specify custom flags to the linker,
2100
- but usage is strongly discouraged. The compiler's usage of the
2101
- system linker is not guaranteed to continue in the future, and
2102
- if the system linker is not used then specifying custom flags
2103
- doesn't have much meaning.
2104
-
2105
2073
If a feature is promoted to a language feature, then all existing programs will
2106
2074
start to receive compilation warnings about #[ feature] directives which enabled
2107
2075
the new feature (because the directive is no longer necessary). However, if
@@ -3225,6 +3193,32 @@ let bo: Binop = add;
3225
3193
x = bo(5,7);
3226
3194
~~~~
3227
3195
3196
+ ### Closure types
3197
+
3198
+ The type of a closure mapping an input of type ` A ` to an output of type ` B ` is ` |A| -> B ` . A closure with no arguments or return values has type ` || ` .
3199
+
3200
+
3201
+ An example of creating and calling a closure:
3202
+
3203
+ ``` rust
3204
+ let captured_var = 10 ;
3205
+
3206
+ let closure_no_args = || println! (" captured_var={}" , captured_var );
3207
+
3208
+ let closure_args = | arg : int | -> int {
3209
+ println! (" captured_var={}, arg={}" , captured_var , arg );
3210
+ arg // Note lack of semicolon after 'arg'
3211
+ };
3212
+
3213
+ fn call_closure (c1 : || , c2 : | int | -> int ) {
3214
+ c1 ();
3215
+ c2 (2 );
3216
+ }
3217
+
3218
+ call_closure (closure_no_args , closure_args );
3219
+
3220
+ ```
3221
+
3228
3222
### Object types
3229
3223
3230
3224
Every trait item (see [ traits] ( #traits ) ) defines a type with the same name as the trait.
@@ -3643,111 +3637,6 @@ queues, as well as code to copy values between queues and their recipients and
3643
3637
to serialize values for transmission over operating-system inter-process
3644
3638
communication facilities.
3645
3639
3646
- ### Linkage
3647
-
3648
- The Rust compiler supports various methods to link crates together both
3649
- statically and dynamically. This section will explore the various methods to
3650
- link Rust crates together, and more information about native libraries can be
3651
- found in the [ ffi tutorial] [ ffi ] .
3652
-
3653
- In one session of compilation, the compiler can generate multiple artifacts
3654
- through the usage of command line flags and the ` crate_type ` attribute.
3655
-
3656
- * ` --bin ` , ` #[crate_type = "bin"] ` - A runnable executable will be produced.
3657
- This requires that there is a ` main ` function in the crate which will be run
3658
- when the program begins executing. This will link in all Rust and native
3659
- dependencies, producing a distributable binary.
3660
-
3661
- * ` --lib ` , ` #[crate_type = "lib"] ` - A Rust library will be produced. This is
3662
- an ambiguous concept as to what exactly is produced because a library can
3663
- manifest itself in several forms. The purpose of this generic ` lib ` option is
3664
- to generate the "compiler recommended" style of library. The output library
3665
- will always be usable by rustc, but the actual type of library may change
3666
- from time-to-time. The remaining output types are all different flavors of
3667
- libraries, and the ` lib ` type can be seen as an alias for one of them (but
3668
- the actual one is compiler-defined).
3669
-
3670
- * ` --dylib ` , ` #[crate_type = "dylib"] ` - A dynamic Rust library will be
3671
- produced. This is different from the ` lib ` output type in that this forces
3672
- dynamic library generation. The resulting dynamic library can be used as a
3673
- dependency for other libraries and/or executables. This output type will
3674
- create ` *.so ` files on linux, ` *.dylib ` files on osx, and ` *.dll ` files on
3675
- windows.
3676
-
3677
- * ` --staticlib ` , ` #[crate_type = "staticlib"] ` - A static system library will
3678
- be produced. This is different from other library outputs in that the Rust
3679
- compiler will never attempt to link to ` staticlib ` outputs. The purpose of
3680
- this output type is to create a static library containing all of the local
3681
- crate's code along with all upstream dependencies. The static library is
3682
- actually a ` *.a ` archive on linux and osx and a ` *.lib ` file on windows. This
3683
- format is recommended for use in situtations such as linking Rust code into an
3684
- existing non-Rust application because it will not have dynamic dependencies on
3685
- other Rust code.
3686
-
3687
- * ` --rlib ` , ` #[crate_type = "rlib"] ` - A "Rust library" file will be produced.
3688
- This is used as an intermediate artifact and can be thought of as a "static
3689
- Rust library". These ` rlib ` files, unlike ` staticlib ` files, are interpreted
3690
- by the Rust compiler in future linkage. This essentially means that ` rustc `
3691
- will look for metadata in ` rlib ` files like it looks for metadata in dynamic
3692
- libraries. This form of output is used to produce statically linked
3693
- executables as well as ` staticlib ` outputs.
3694
-
3695
- Note that these outputs are stackable in the sense that if multiple are
3696
- specified, then the compiler will produce each form of output at once without
3697
- having to recompile.
3698
-
3699
- With all these different kinds of outputs, if crate A depends on crate B, then
3700
- the compiler could find B in various different forms throughout the system. The
3701
- only forms looked for by the compiler, however, are the ` rlib ` format and the
3702
- dynamic library format. With these two options for a dependent library, the
3703
- compiler must at some point make a choice between these two formats. With this
3704
- in mind, the compiler follows these rules when determining what format of
3705
- dependencies will be used:
3706
-
3707
- 1 . If a dynamic library is being produced, then it is required for all upstream
3708
- Rust dependencies to also be dynamic. This is a limitation of the current
3709
- implementation of the linkage model. The reason behind this limitation is to
3710
- prevent multiple copies of the same upstream library from showing up, and in
3711
- the future it is planned to support a mixture of dynamic and static linking.
3712
-
3713
- When producing a dynamic library, the compiler will generate an error if an
3714
- upstream dependency could not be found, and also if an upstream dependency
3715
- could only be found in an ` rlib ` format. Remember that ` staticlib ` formats
3716
- are always ignored by ` rustc ` for crate-linking purposes.
3717
-
3718
- 2 . If a static library is being produced, all upstream dependecies are
3719
- required to be available in ` rlib ` formats. This requirement stems from the
3720
- same reasons that a dynamic library must have all dynamic dependencies.
3721
-
3722
- Note that it is impossible to link in native dynamic dependencies to a static
3723
- library, and in this case warnings will be printed about all unlinked native
3724
- dynamic dependencies.
3725
-
3726
- 3 . If an ` rlib ` file is being produced, then there are no restrictions on what
3727
- format the upstream dependencies are available in. It is simply required that
3728
- all upstream dependencies be available for reading metadata from.
3729
-
3730
- The reason for this is that ` rlib ` files do not contain any of their upstream
3731
- dependencies. It wouldn't be very efficient for all ` rlib ` files to contain a
3732
- copy of ` libstd.rlib ` !
3733
-
3734
- 4 . If an executable is being produced, then things get a little interesting. As
3735
- with the above limitations in dynamic and static libraries, it is required
3736
- for all upstream dependencies to be in the same format. The next question is
3737
- whether to prefer a dynamic or a static format. The compiler currently favors
3738
- static linking over dynamic linking, but this can be inverted with the `-Z
3739
- prefer-dynamic` flag to the compiler.
3740
-
3741
- What this means is that first the compiler will attempt to find all upstream
3742
- dependencies as ` rlib ` files, and if successful, it will create a statically
3743
- linked executable. If an upstream dependency is missing as an ` rlib ` file,
3744
- then the compiler will force all dependencies to be dynamic and will generate
3745
- errors if dynamic versions could not be found.
3746
-
3747
- In general, ` --bin ` or ` --lib ` should be sufficient for all compilation needs,
3748
- and the other options are just available if more fine-grained control is desired
3749
- over the output format of a Rust crate.
3750
-
3751
3640
### Logging system
3752
3641
3753
3642
The runtime contains a system for directing [ logging
@@ -3899,5 +3788,3 @@ Additional specific influences can be seen from the following languages:
3899
3788
* The typeclass system of Haskell.
3900
3789
* The lexical identifier rule of Python.
3901
3790
* The block syntax of Ruby.
3902
-
3903
- [ ffi ] : tutorial-ffi.html
0 commit comments