Rust 0.8
-
~2200 changes, numerous bugfixes
-
Language
- The
for
loop syntax has changed to work with theIterator
trait. - At long last, unwinding works on Windows.
- Default methods are ready for use.
- Many trait inheritance bugs fixed.
- Owned and borrowed trait objects work more reliably.
copy
is no longer a keyword. It has been replaced by theClone
trait.- rustc can omit emission of code for the
debug!
macro if it is passed--cfg ndebug
- mod.rs is now "blessed". When loading
mod foo;
, rustc will now look for foo.rs, then foo/mod.rs, and will generate an error when both are present. - Strings no longer contain trailing nulls. The new
std::c_str
module provides new mechanisms for converting to C strings. - The type of foreign functions is now
extern "C" fn
instead of `*u8'. - The FFI has been overhauled such that foreign functions are called directly, instead of through a stack-switching wrapper.
- Calling a foreign function must be done through a Rust function with the
#[fixed_stack_segment]
attribute. - The
externfn!
macro can be used to declare both a foreign function and a#[fixed_stack_segment]
wrapper at once. pub
andpriv
modifiers onextern
blocks are no longer parsed.unsafe
is no longer allowed on extern fns - they are all unsafe.priv
is disallowed everywhere except for struct fields and enum variants.&T
(besides&'static T
) is no longer allowed in@T
.ref
bindings in irrefutable patterns work correctly now.char
is now prevented from containing invalid code points.- Casting to
bool
is no longer allowed. \0
is now accepted as an escape in chars and strings.yield
is a reserved keyword.typeof
is a reserved keyword.- Crates may be imported by URL with
extern mod foo = "url";
. - Explicit enum discriminants may be given as uints as in
enum E { V = 0u }
- Static vectors can be initialized with repeating elements, e.g.
static foo: [u8, .. 100]: [0, .. 100];
. - Static structs can be initialized with functional record update, e.g.
static foo: Foo = Foo { a: 5, .. bar };
. cfg!
can be used to conditionally execute code based on the crate configuration, similarly to#[cfg(...)]
.- The
unnecessary_qualification
lint detects unneeded module prefixes (default: allow). - Arithmetic operations have been implemented on the SIMD types in
std::unstable::simd
. - Exchange allocation headers were removed, reducing memory usage.
format!
implements a completely new, extensible, and higher-performance string formatting system. It will replacefmt!
.print!
andprintln!
write formatted strings (using theformat!
extension) to stdout.write!
andwriteln!
write formatted strings (using theformat!
extension) to the new Writers instd::rt::io
.- The library section in which a function or static is placed may be specified with
#[link_section = "..."]
. - The
proto!
syntax extension for defining bounded message protocols was removed. macro_rules!
is hygienic forlet
declarations.- The
#[export_name]
attribute specifies the name of a symbol. unreachable!
can be used to indicate unreachable code, and fails if executed.
- The
-
Libraries
- std: Transitioned to the new runtime, written in Rust.
- std: Added an experimental I/O library,
rt::io
, based on the new runtime. - std: A new generic
range
function was added to the prelude, replacinguint::range
and friends. - std:
range_rev
no longer exists. Since range is an iterator it can be reversed withrange(lo, hi).invert()
. - std: The
chain
method on option renamed toand_then
;unwrap_or_default
renamed tounwrap_or
. - std: The
iterator
module was renamed toiter
. - std: Integral types now support the
checked_add
,checked_sub
, andchecked_mul
operations for detecting overflow. - std: Many methods in
str
,vec
,option,
result` were renamed for consistency. - std: Methods are standardizing on conventions for casting methods:
to_foo
for copying,into_foo
for moving,as_foo
for temporary and cheap casts. - std: The
CString
type inc_str
provides new ways to convert to and from C strings. - std:
DoubleEndedIterator
can yield elements in two directions. - std: The
mut_split
method on vectors partitions an&mut [T]
into two splices. - std:
str::from_bytes
renamed tostr::from_utf8
. - std:
pop_opt
andshift_opt
methods added to vectors. - std: The task-local data interface no longer uses @, and keys are no longer function pointers.
- std: The
swap_unwrap
method ofOption
renamed totake_unwrap
. - std: Added
SharedPort
tocomm
. - std:
Eq
has a default method forne
; onlyeq
is required in implementations. - std:
Ord
has default methods forle
,gt
andge
; onlylt
is required in implementations. - std:
is_utf8
performance is improved, impacting many string functions. - std:
os::MemoryMap
provides cross-platform mmap. - std:
ptr::offset
is now unsafe, but also more optimized. Offsets that are not 'in-bounds' are considered undefined. - std: Many freestanding functions in
vec
removed in favor of methods. - std: Many freestanding functions on scalar types removed in favor of methods.
- std: Many options to task builders were removed since they don't make sense in the new scheduler design.
- std: More containers implement
FromIterator
so can be created by thecollect
method. - std: More complete atomic types in
unstable::atomics
. - std:
comm::PortSet
removed. - std: Mutating methods in the
Set
andMap
traits have been moved into theMutableSet
andMutableMap
traits.Container::is_empty
,Map::contains_key
,MutableMap::insert
, andMutableMap::remove
have default implementations. - std: Various
from_str
functions were removed in favor of a genericfrom_str
which is available in the prelude. - std:
util::unreachable
removed in favor of theunreachable!
macro. - extra:
dlist
, the doubly-linked list was modernized. - extra: Added a
hex
module withToHex
andFromHex
traits. - extra: Added
glob
module, replacingstd::os::glob
. - extra:
rope
was removed. - extra:
deque
was renamed toringbuf
.RingBuf
implementsDeque
. - extra:
net
, andtimer
were removed. The experimental replacements arestd::rt::io::net
andstd::rt::io::timer
. - extra: Iterators implemented for
SmallIntMap
. - extra: Iterators implemented for
Bitv
andBitvSet
. - extra:
SmallIntSet
removed. UseBitvSet
. - extra: Performance of JSON parsing greatly improved.
- extra:
semver
updated to SemVer 2.0.0. - extra:
term
handles more terminals correctly. - extra:
dbg
module removed. - extra:
par
module removed. - extra:
future
was cleaned up, with some method renames. - extra: Most free functions in
getopts
were converted to methods.
-
Other
- rustc's debug info generation (
-Z debug-info
) is greatly improved. - rustc accepts
--target-cpu
to compile to a specific CPU architecture, similarly to gcc's--march
flag. - rustc's performance compiling small crates is much better.
- rustpkg has received many improvements.
- rustpkg supports git tags as package IDs.
- rustpkg builds into target-specific directories so it can be used for cross-compiling.
- The number of concurrent test tasks is controlled by the environment variable RUST_TEST_TASKS.
- The test harness can now report metrics for benchmarks.
- All tools have man pages.
- Programs compiled with
--test
now support the-h
and--help
flags. - The runtime uses jemalloc for allocations.
- Segmented stacks are temporarily disabled as part of the transition to the new runtime. Stack overflows are possible!
- A new documentation backend, rustdoc_ng, is available for use. It is still invoked through the normal
rustdoc
command.
- rustc's debug info generation (