Rust 0.6.0
Released on April 3, 2013
What's Changed
- ~2100 changes, numerous bugfixes
- Syntax changes
- The self type parameter in traits is now spelled
Self - The
selfparameter in trait and impl methods must now be explicitly - Static methods no longer require the
statickeyword and instead - Replaced the
Durabletrait with the'staticlifetime - The old closure type syntax with the trailing sigil has been
superis a keyword, and may be prefixed to paths- Trait bounds are separated with
+instead of whitespace - Traits are implemented with
impl Trait for Type - Lifetime syntax is now
&'l fooinstead of&l/foo - The
exportkeyword has finally been removed - The
movekeyword has been removed (see "Semantic changes") - The interior mutability qualifier on vectors,
[mut T], has been mutis no longer valid in~mut T. Use inherited mutabilityfailis no longer a keyword. Usefail!()assertis no longer a keyword. Useassert!()logis no longer a keyword. usedebug!, etc.- 1-tuples may be represented as
(T,) - Struct fields may no longer be
mut. Use inherited mutability, extern mod { ... }is no longer valid syntax for foreign- Newtype enums removed. Use tuple-structs.
- Trait implementations no longer support visibility modifiers
- Pattern matching over vectors improved and expanded
constrenamed tostaticto correspond to lifetime name,- Replaced
#[deriving_eq]with#[deriving(Eq)], etc. Cloneimplementations can be automatically generated with- Casts to traits must use a pointer sigil, e.g.
@foo as @Bar - Fixed length vector types are now written as
[int, .. 3] - Fixed length vector types can express the length as a constant
- Semantic changes
- Types with owned pointers or custom destructors move by default,
- All foreign functions are considered unsafe
- &mut is now unaliasable
- Writes to borrowed @mut pointers are prevented dynamically
- () has size 0
- The name of the main function can be customized using #[main]
- The default type of an inferred closure is &fn instead of @fn
usestatements may no longer be "chained" - they cannot importusestatements are crate relative, importing from the "top"- Method visibility is inherited from the implementation declaration
- Structural records have been removed
- Many more types can be used in static items, including enums
- Pattern matching over vectors improved and expanded
- Typechecking of closure types has been overhauled to
- Macros leave scope at the end of modules, unless that module is
- Libraries
- Added big integers to
std::bigint - Removed
core::oldcommmodule - Added pipe-based
core::commmodule - Numeric traits have been reorganized under
core::num vec::slicefinally returns a slicedebug!and friends don't require a format string, e.g.debug!(Foo)- Containers reorganized around traits in
core::container core::dvecremoved,~[T]is a drop-in replacementcore::send_maprenamed tocore::hashmapstd::mapremoved; replaced withcore::hashmapstd::treemapreimplemented as an owned balanced treestd::dequeandstd::smallintmapreimplemented as owned containerscore::trieadded as a fast ordered map for integer keys- Set types added to
core::hashmap,core::trieandstd::treemap Ordsplit intoOrdandTotalOrd.Ordis still used to- Other
- Replaced the 'cargo' package manager with 'rustpkg'
- Added all-purpose 'rust' tool
rustc --testnow supports benchmarks with the#[bench]attribute- rustc now attempts to offer spelling suggestions
- Improved support for ARM and Android
- Preliminary MIPS backend
- Improved foreign function ABI implementation for x86, x86_64
- Various memory usage improvements
- Rust code may be embedded in foreign code under limited circumstances
- Inline assembler supported by new asm!() syntax extension.
Full Changelog
* ~2100 changes, numerous bugfixes
* Syntax changes
* The self type parameter in traits is now spelled Self
* The self parameter in trait and impl methods must now be explicitly
named (for example: fn f(&self) { }). Implicit self is deprecated.
* Static methods no longer require the static keyword and instead
are distinguished by the lack of a self parameter
* Replaced the Durable trait with the 'static lifetime
* The old closure type syntax with the trailing sigil has been
removed in favor of the more consistent leading sigil
* super is a keyword, and may be prefixed to paths
* Trait bounds are separated with + instead of whitespace
* Traits are implemented with impl Trait for Type
instead of impl Type: Trait
* Lifetime syntax is now &'l foo instead of &l/foo
* The export keyword has finally been removed
* The move keyword has been removed (see "Semantic changes")
* The interior mutability qualifier on vectors, [mut T], has been
removed. Use &mut [T], etc.
* mut is no longer valid in ~mut T. Use inherited mutability
* fail is no longer a keyword. Use fail!()
* assert is no longer a keyword. Use assert!()
* log is no longer a keyword. use debug!, etc.
* 1-tuples may be represented as (T,)
* Struct fields may no longer be mut. Use inherited mutability,
@mut T, core::mut or core::cell
* extern mod { ... } is no longer valid syntax for foreign
function modules. Use extern blocks: extern { ... }
* Newtype enums removed. Use tuple-structs.
* Trait implementations no longer support visibility modifiers
* Pattern matching over vectors improved and expanded
* const renamed to static to correspond to lifetime name,
and make room for future static mut unsafe mutable globals.
* Replaced #[deriving_eq] with #[deriving(Eq)], etc.
* Clone implementations can be automatically generated with
#[deriving(Clone)]
* Casts to traits must use a pointer sigil, e.g. @foo as @Bar
instead of foo as Bar.
* Fixed length vector types are now written as [int, .. 3]
instead of [int * 3].
* Fixed length vector types can express the length as a constant
expression. (ex: [int, .. GL_BUFFER_SIZE - 2])
* Semantic changes
* Types with owned pointers or custom destructors move by default,
eliminating the move keyword
* All foreign functions are considered unsafe
* &mut is now unaliasable
* Writes to borrowed @mut pointers are prevented dynamically
* () has size 0
* The name of the main function can be customized using #[main]
* The default type of an inferred closure is &fn instead of @fn
* use statements may no longer be "chained" - they cannot import
identifiers imported by previous use statements
* use statements are crate relative, importing from the "top"
of the crate by default. Paths may be prefixed with super::
or self:: to change the search behavior.
* Method visibility is inherited from the implementation declaration
* Structural records have been removed
* Many more types can be used in static items, including enums
'static-lifetime pointers and vectors
* Pattern matching over vectors improved and expanded
* Typechecking of closure types has been overhauled to
improve inference and eliminate unsoundness
* Macros leave scope at the end of modules, unless that module is
tagged with #[macro_escape]
* Libraries
* Added big integers to std::bigint
* Removed core::oldcomm module
* Added pipe-based core::comm module
* Numeric traits have been reorganized under core::num
* vec::slice finally returns a slice
* debug! and friends don't require a format string, e.g. debug!(Foo)
* Containers reorganized around traits in core::container
* core::dvec removed, ~[T] is a drop-in replacement
* core::send_map renamed to core::hashmap
* std::map removed; replaced with core::hashmap
* std::treemap reimplemented as an owned balanced tree
* std::deque and std::smallintmap reimplemented as owned containers
* core::trie added as a fast ordered map for integer keys
* Set types added to core::hashmap, core::trie and std::treemap
* Ord split into Ord and TotalOrd. Ord is still used to
overload the comparison operators, whereas TotalOrd is used
by certain container types
* Other
* Replaced the 'cargo' package manager with 'rustpkg'
* Added all-purpose 'rust' tool
* rustc --test now supports benchmarks with the #[bench] attribute
* Improved support for ARM and Android
* Preliminary MIPS backend
* Improved foreign function ABI implementation for x86, x86_64
* Various memory usage improvements
* Rust code may be embedded in foreign code under limited circumstances
* Inline assembler supported by new asm!() syntax extension.