Rust 0.9
-
~1800 changes, numerous bugfixes
-
Language
- The
float
type has been removed. Usef32
orf64
instead. - A new facility for enabling experimental features (feature gating) has been added, using the crate-level
#[feature(foo)]
attribute. - Managed boxes (@) are now behind a feature gate (
#[feature(managed_boxes)]
) in preparation for future removal. Use the standard library'sGc
orRc
types instead. @mut
has been removed. Usestd::cell::{Cell, RefCell}
instead.- Jumping back to the top of a loop is now done with
continue
instead ofloop
. - Strings can no longer be mutated through index assignment.
- Raw strings can be created via the basic
r"foo"
syntax or with matched hash delimiters, as inr###"foo"###
. ~fn
is now writtenproc (args) -> retval { ... }
and may only be called once.- The
&fn
type is now written|args| -> ret
to match the literal form. @fn
s have been removed.do
only works with procs in order to make it obvious what the cost ofdo
is.- Single-element tuple-like structs can no longer be dereferenced to obtain the inner value. A more comprehensive solution for overloading the dereference operator will be provided in the future.
- The
#[link(...)]
attribute has been replaced with#[crate_id = "name#vers"]
. - Empty
impl
s must be terminated with empty braces and may not be terminated with a semicolon. - Keywords are no longer allowed as lifetime names; the
self
lifetime no longer has any special meaning. - The old
fmt!
string formatting macro has been removed. printf!
andprintfln!
(old-style formatting) removed in favor ofprint!
andprintln!
.mut
works in patterns now, as inlet (mut x, y) = (1, 2);
.- The
extern mod foo (name = "bar")
syntax has been removed. Useextern mod foo = "bar"
instead. - New reserved keywords:
alignof
,offsetof
,sizeof
. - Macros can have attributes.
- Macros can expand to items with attributes.
- Macros can expand to multiple items.
- The
asm!
macro is feature-gated (#[feature(asm)]
). - Comments may be nested.
- Values automatically coerce to trait objects they implement, without an explicit
as
. - Enum discriminants are no longer an entire word but as small as needed to contain all the variants. The
repr
attribute can be used to override the discriminant size, as in#[repr(int)]
for integer-sized, and#[repr(C)]
to match C enums. - Non-string literals are not allowed in attributes (they never worked).
- The FFI now supports variadic functions.
- Octal numeric literals, as in
0o7777
. - The
concat!
syntax extension performs compile-time string concatenation. - The
#[fixed_stack_segment]
and#[rust_stack]
attributes have been removed as Rust no longer uses segmented stacks. - Non-ascii identifiers are feature-gated (
#[feature(non_ascii_idents)]
). - Ignoring all fields of an enum variant or tuple-struct is done with
..
, not*
; ignoring remaining fields of a struct is also done with..
, not_
; ignoring a slice of a vector is done with..
, not.._
. rustc
supports the "win64" calling convention viaextern "win64"
.rustc
supports the "system" calling convention, which defaults to the preferred convention for the target platform, "stdcall" on 32-bit Windows, "C" elsewhere.- The
type_overflow
lint (default: warn) checks literals for overflow. - The
unsafe_block
lint (default: allow) checks for usage ofunsafe
. - The
attribute_usage
lint (default: warn) warns about unknown attributes. - The
unknown_features
lint (default: warn) warns about unknown feature gates. - The
dead_code
lint (default: warn) checks for dead code. - Rust libraries can be linked statically to one another
#[link_args]
is behind thelink_args
feature gate.- Native libraries are now linked with
#[link(name = "foo")]
- Native libraries can be statically linked to a rust crate (
#[link(name = "foo", kind = "static")]
). - Native OS X frameworks are now officially supported (
#[link(name = "foo", kind = "framework")]
). - The
#[thread_local]
attribute creates thread-local (not task-local) variables. Currently behind thethread_local
feature gate. - The
return
keyword may be used in closures. - Types that can be copied via a memcpy implement the
Pod
kind. - The
cfg
attribute can now be used on struct fields and enum variants.
- The
-
Libraries
- std: The
option
andresult
API's have been overhauled to make them simpler, more consistent, and more composable. - std: The entire
std::io
module has been replaced with one that is more comprehensive and that properly interfaces with the underlying scheduler. File, TCP, UDP, Unix sockets, pipes, and timers are all implemented. - std:
io::util
contains a number of useful implementations ofReader
andWriter
, includingNullReader
,NullWriter
,ZeroReader
,TeeReader
. - std: The reference counted pointer type
extra::rc
moved into std. - std: The
Gc
type in thegc
module will replace@
(it is currently just a wrapper around it). - std: The
Either
type has been removed. - std:
fmt::Default
can be implemented for any type to provide default formatting to theformat!
macro, as informat!("{}", myfoo)
. - std: The
rand
API continues to be tweaked. - std: The
rust_begin_unwind
function, useful for inserting breakpoints on failure in gdb, is now namedrust_fail
. - std: The
each_key
andeach_value
methods onHashMap
have been replaced by thekeys
andvalues
iterators. - std: Functions dealing with type size and alignment have moved from the
sys
module to themem
module. - std: The
path
module was written and API changed. - std:
str::from_utf8
has been changed to cast instead of allocate. - std:
starts_with
andends_with
methods added to vectors via theImmutableEqVector
trait, which is in the prelude. - std: Vectors can be indexed with the
get_opt
method, which returnsNone
if the index is out of bounds. - std: Task failure no longer propagates between tasks, as the model was complex, expensive, and incompatible with thread-based tasks.
- std: The
Any
type can be used for dynamic typing. - std:
~Any
can be passed to thefail!
macro and retrieved viatask::try
. - std: Methods that produce iterators generally do not have an
_iter
suffix now. - std:
cell::Cell
andcell::RefCell
can be used to introduce mutability roots (mutable fields, etc.). Use instead of e.g.@mut
. - std:
util::ignore
renamed toprelude::drop
. - std: Slices have
sort
andsort_by
methods via theMutableVector
trait. - std:
vec::raw
has seen a lot of cleanup and API changes. - std: The standard library no longer includes any C++ code, and very minimal C, eliminating the dependency on libstdc++.
- std: Runtime scheduling and I/O functionality has been factored out into extensible interfaces and is now implemented by two different crates: libnative, for native threading and I/O; and libgreen, for green threading and I/O. This paves the way for using the standard library in more limited embedded environments.
- std: The
comm
module has been rewritten to be much faster, have a simpler, more consistent API, and to work for both native and green threading. - std: All libuv dependencies have been moved into the rustuv crate.
- native: New implementations of runtime scheduling on top of OS threads.
- native: New native implementations of TCP, UDP, file I/O, process spawning, and other I/O.
- green: The green thread scheduler and message passing types are almost entirely lock-free.
- extra: The
flatpipes
module had bitrotted and was removed. - extra: All crypto functions have been removed and Rust now has a policy of not reimplementing crypto in the standard library. In the future crypto will be provided by external crates with bindings to established libraries.
- extra:
c_vec
has been modernized. - extra: The
sort
module has been removed. Use thesort
method on mutable slices.
- std: The
-
Tooling
- The
rust
andrusti
commands have been removed, due to lack of maintenance. rustdoc
was completely rewritten.rustdoc
can test code examples in documentation.rustpkg
can test packages with the argument, 'test'.rustpkg
supports arbitrary dependencies, including C libraries.rustc
's support for generating debug info is improved again.rustc
has better error reporting for unbalanced delimiters.rustc
's JIT support was removed due to bitrot.- Executables and static libraries can be built with LTO (-Z lto)
rustc
adds a--dep-info
flag for communicating dependencies to build tools.
- The