Title: This Week in Rust 58 Date: 2014-11-24 Category: This Week in Rust Hello and welcome to another issue of *This Week in Rust*! [Rust](http://rust-lang.org) is a systems language pursuing the trifecta: safe, concurrent, and fast. This is a weekly summary of its progress and community. Want something mentioned? [Send me an email!](mailto:corey@octayn.net?subject=This%20Week%20in%20Rust%20Suggestion) Want to get involved? [We love contributions](https://github.com/mozilla/rust/wiki/Note-guide-for-new-contributors). The big news this week was that the [central crate repository][crates.io] is [now live][crates.io-blog]. There was much discussion on [Hacker News][crates.io-hn], [/r/rust][crates.io-reddit1] and [/r/programming][crates.io-reddit2]. [crates.io]: https://crates.io/ [crates.io-blog]: http://blog.rust-lang.org/2014/11/20/Cargo.html [crates.io-hn]: http://news.ycombinator.com/item?id=8637493 [crates.io-reddit1]: https://www.reddit.com/r/rust/comments/2mwice/cratesio_has_shipped/ [crates.io-reddit2]: https://www.reddit.com/r/programming/comments/2mwidh/rusts_central_package_repository_is_up/ We also have a new [guide to error handling][error]. [error]: http://doc.rust-lang.org/guide-error-handling.html # What's cooking on master? 100 pull requests were [merged in the last week][1]. [1]: https://github.com/rust-lang/rust/pulls?q=is%3Apr+is%3Amerged+updated%3A2014-11-17..2014-11-23 ## Breaking Changes * Enum variants are now [namespaced by their type name][enumns], a major change. Enums in the standard library have been reexported in their old locations, for now at least. [RFC][enumns-rfc]. [Reddit][enumns-reddit]. * Collections have been modified to [no longer require the various `_equiv` methods][borrow], which are now deprecated. Methods that search by key and value now often take a generic type that implements `BorrowFrom`, which converts e.g. both `str` and `String` to `&str`. [RFC][borrow-rfc]. * As part of ongoing [DST-ification][dst], `AsSlice` has been [modified to work with unsized types][unsized-asslice]. This breaks existing code because `AsSlice` type vars should now be taken by reference. At the same time, some of the ops have been extended to work with unsized types. * The `str` method `slice_shift_char`'s return type [has changed slightly][slice_shift_char]. * The `find_copy` and `get_copy` methods of `HashMap` [are deprecated][cloned]. `find_copy` can be performed with `map.get(&key).cloned()`, which converts the `Option<&T>` returned by `get` to `Option`, and `get_copy` to simply `map[key].clone()`, which calls `.clone()` on the value returned by reference from the indexing operator. * [Runtime removal continues][rt]. Breaking changes here are mostly to code invoking the runtime directly. * The `overloaded_calls` and `unboxed_closure_sugar` feature gates [have been combined][gates] into a single `unboxed_closures` gate. * Formatting has [seen a stability pass][fmt] with some minor breaking changes. [RFC][fmt-rfc]. * The little-used `col!` macro is [renamed to `column!`][column]. * Non-ASCII lifetime identifiers are [behind the `non_ascii_idents` feature gate][ascii] as intended. * [Struct variants can not be matched as if they were tuple variants][varmatch]. * There have been [several breaking changes and deprecations to `std::char`][stdchar]. * Likewise, there have been a number of changes to the code [dealing with raw string and vector processing][raw]. [enumns]: https://github.com/rust-lang/rust/pull/18973 [enumns-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0390-enum-namespacing.md [enumns-reddit]: https://www.reddit.com/r/rust/comments/2ml4oo/switch_to_purely_namespaced_enums/ [dst]: http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/ [unsized-asslice]: https://github.com/rust-lang/rust/pull/18638 [slice_shift_char]: https://github.com/rust-lang/rust/pull/18911 [cloned]: https://github.com/rust-lang/rust/pull/18914 [rt]: https://github.com/rust-lang/rust/pull/18967 [gates]: https://github.com/rust-lang/rust/pull/18993 [fmt]: https://github.com/rust-lang/rust/pull/19040 [fmt-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0380-stabilize-std-fmt.md [column]: https://github.com/rust-lang/rust/pull/19071 [ascii]: https://github.com/rust-lang/rust/pull/19073 [varmatch]: https://github.com/rust-lang/rust/pull/19087 [stdchar]: https://github.com/rust-lang/rust/pull/18603 [borrow]: https://github.com/rust-lang/rust/pull/18910 [borrow-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md [raw]: https://github.com/rust-lang/rust/pull/19152 ## Other Changes * Rust now [supports higher-ranked trait bounds][hrtb]. This is necessary to make unboxed closures work, but the implications are quite complex. Read the [RFC][hrtb-rfc] for details. * `Vec` [implements `Writer`][vec-writer] and `MemWriter` is deprecated. * All statics now [support the `#[linkage]` attribute][linkage], which is behind the `linkage` feature gate. * Parts of rustc have been [pulled into a new `rustc_trans` crate][rustc_trans] to reduce memory pressure. * All idents following literals are [tokenized specially][litid] now as future proofing. [RFC][litid-rfc]. * [Unboxed closures can be written with the sugared syntax][sugar]. [hrtb]: https://github.com/rust-lang/rust/pull/18993 [hrtb-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0387-higher-ranked-trait-bounds.md [vec-writer]: https://github.com/rust-lang/rust/pull/18885 [linkage]: https://github.com/rust-lang/rust/pull/18890 [rustc_trans]: https://github.com/rust-lang/rust/pull/19070 [litid]: https://github.com/rust-lang/rust/pull/19103 [litid-rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0463-future-proof-literal-suffixes.md [sugar]: https://github.com/rust-lang/rust/pull/19113 ## New Contributors * Andrew Cann * Gleb Kozyrev * Jashank Jeremy * jmu303 * Joonas Javanainen * jxv * Nicholas Bishop * oli-obk * sheroze1123 * Simon Wollwage * Vadim Petrochenkov * we # Approved RFC's * [Higher-ranked trait bounds][rfc387]: Makes the type-system powerful enough to deal with unboxed closures as well as boxed ones. * [RFC to restrict placing an identifier after a literal.][rfc463]: Future-proofs syntax for literals * [Finalizing more naming conventions][rfc430]: snake_case-type stuff and `unwrap` vs `into_inner` * [Change precedence of `+` in type grammar][rfc438]: Cleans up a some weird parsing interactions * [cmp and ops reform][rfc439]: DST-ify operators, add multi-dispatch, make them by-value for flexibility, add IndexSet, unify slice operators with `..` notation sugaring to special types, kill Equiv * [Add a thread local storage module, std::tls][rfc461]: Introduces Scoped TLS and Owned TLS in a new thread_local module to replace the old design. Should have better perf, be more flexible. [rfc387]: https://github.com/rust-lang/rfcs/pull/387 [rfc463]: https://github.com/rust-lang/rfcs/pull/463 [rfc430]: https://github.com/rust-lang/rfcs/pull/430 [rfc438]: https://github.com/rust-lang/rfcs/pull/438 [rfc439]: https://github.com/rust-lang/rfcs/pull/439 [rfc461]: https://github.com/rust-lang/rfcs/pull/461 # New RFC's * [Release channels and feature staging][rfc475]: This RFC describes changes to the Rust release process, primarily the division of Rust's time-based releases into 'release channels', following the 'release train' model used by e.g. Firefox and Chrome; as well as 'feature staging', which enables the continued development of experimental language features and libraries APIs while providing strong stability guarantees in stable releases. * [path reform][rfc474]: This RFC reforms the design of the std::path module in preparation for API stabilization. The path API must deal with many competing demands, and the current design handles many of them, but suffers from some significant problems given in "Motivation" below. The RFC proposes a redesign modeled loosely on the current API that addresses these problems while maintaining the advantages of the current design. * [placement box with Placer trait for overloading][rfc470]: Add user-defined placement in expression (more succinctly, "an in expression"), an operator analogous to "placement new" in C++. This provides a way for a user to specify (1.) how the backing storage for some datum should be allocated, (2.) that the allocation should be ordered before the evaluation of the datum, and (3.) that the datum should preferably be stored directly into the backing storage (rather than allocating temporary storage on the stack and then copying the datum from the stack into the backing storage). * [Feature gate box patterns][rfc469]: Move box patterns behind a feature gate.The general idea is good, but the semantics aren't baked enough for 1.0. * [Add "function name macro"][rfc466]: This RFC proposes the addition of a function! macro that expands to the function it's used in. This will greatly help error reporting. [rfc474]: https://github.com/rust-lang/rfcs/pull/474 [rfc475]: https://github.com/rust-lang/rfcs/pull/475 [rfc470]: https://github.com/rust-lang/rfcs/pull/470 [rfc469]: https://github.com/rust-lang/rfcs/pull/469 [rfc466]: https://github.com/rust-lang/rfcs/pull/466 # Community Karen Rustad found a wild [rustacean](https://twitter.com/whoisaldeka/status/535679593353854976). ## From the Team * [Weekly-meetings/2014-11-18][mtg]: cmp/ops; TLS; future-proofing literal parsing; ungating tuple indexing, if/while let; naming conventions; struct variants matching; for syntax for higher-order lifetimes; macros; type parameter grammar; better shepherding [Reddit][mtg-reddit]. * [Cargo: Rust's community crate host][cargo]. [mtg]: https://github.com/rust-lang/meeting-minutes/blob/master/weekly-meetings/2014-11-18.md [mtg-reddit]: https://www.reddit.com/r/rust/comments/2mwdhn/weekly_meeting_20141118/ [cargo]: http://blog.rust-lang.org/2014/11/20/Cargo.html ## Videos * [Introduction to programming safe and efficient systems in Rust][vid]. Jakub Bukaj at Øredev. [vid]: http://vimeo.com/111852387 ## Blog Posts * [Rust, Lifetimes, and Collections][coll]. Alexis Beingessner (aka Gankro), who has been driving the current modernization of the collections libs, talks about the design of collections in Rust. [Reddit][coll-reddit]. [HN][coll-hn]. * [Chasing an EPROTOTYPE Through Rust, Sendto, and the OSX Kernel With C-Reduce][erickt]. [Reddit][erickt-reddit]. * [Rust tools][tools]. Nick Cameron has been thinking about the state of Rust tooling. [Reddit][tools-reddit]. * [Roguelike Tutorial in Rust: Part 5: Combat! Part III][rogue]. [Reddit][rogue-reddit]. [coll]: http://cglab.ca/~abeinges/blah/rust-lifetimes-and-collections/ [coll-hn]: http://news.ycombinator.com/item?id=8629789 [coll-reddit]: https://www.reddit.com/r/rust/comments/2mqwdm/rust_lifetimes_and_collections/ [erickt]: https://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/ [erickt-reddit]: https://www.reddit.com/r/rust/comments/2mslk8/chasing_an_eprototype_through_rust_sendto_and_the/ [tools]: https://gist.github.com/nick29581/a3bbf6dd1b14ce57f18c [tools-reddit]: https://www.reddit.com/r/rust/comments/2mqkwk/rust_tools/ [rogue]: http://jaredonline.svbtle.com/roguelike-tutorial-in-rust-part-5 [rogue-reddit]: https://www.reddit.com/r/rust/comments/2mlq0h/roguelike_tutorial_in_rust_part_5_combat_part_iii/ ## Discussions * [What are the advantages of Rust over modern C++?][c++] * [What does 'unwrap' mean in Rust?][unwrap] * [How would a Rust application be able to properly react to low level failures, like memory allocation failure?][ll] * [The Race Towards 1.0 and The Standard Library][race]. * [Is Rust recommended for beginners with 0 programming language experience?][newb]. TL;DR it depends. * [Feedback wanted: improved Rust error handling][err]. More experiments from mitsuhiko. * [Benchmarks on different Map implementations for uint keys][bench]. [c++]: https://www.reddit.com/r/rust/comments/2mwpie/what_are_the_advantages_of_rust_over_modern_c/ [unwrap]: https://www.reddit.com/r/rust/comments/2mw2ns/what_does_unwrap_mean_in_rust/ [ll]: https://www.reddit.com/r/rust/comments/2mthq2/how_would_a_rust_application_be_able_to_properly/ [race]: https://www.reddit.com/r/rust/comments/2mo0zb/the_race_towards_10_and_the_standard_library/ [newb]: https://www.reddit.com/r/rust/comments/2mlq18/is_rust_recommended_for_beginners_with_0/ [err]: https://www.reddit.com/r/rust/comments/2n6mpm/feedback_wanted_improved_rust_error_handling/ [bench]: https://www.reddit.com/r/rust/comments/2n2v3l/benchmarks_on_different_map_implementations_for/ ## New Projects * [rust-eh]. Python-like error tracebacks, from mitsuhiko. * [rust-incidents]. More error experiments from mitsuhiko. * `sl`, the classic Unix command, [in Rust][sl]. * [img_hash]. Perceptual hashing of images. * [raw-rs]. Utilities for manipulation of Rust core types. * [rust-uchardet]. Encoding detection. * [Rust-Relay]. IRC client library. Start your bots! * [cargo-do]. Cargo plugin for running multiple commands at once. * [dbus-rs]. D-Bus bindings. * [rusty-abstract-algebra]. * [wire]. An abstraction over TCP and binary serialization. [rust-eh]: https://www.reddit.com/r/rust/comments/2mjqzi/rusteh_python_like_error_tracebacks_for_rust/ [rust-incidents]: https://www.reddit.com/r/rust/comments/2n6mpm/feedback_wanted_improved_rust_error_handling/ [sl]: https://www.reddit.com/r/rust/comments/2mrep5/sl1_reimplementation_in_rust/ [img_hash]: https://www.reddit.com/r/rust/comments/2mq3dg/img_hash_a_simple_rust_library_for_performing/ [raw-rs]: https://www.reddit.com/r/rust/comments/2mp0il/rawrs_utilities_for_unsafe_manipulation_of_core/ [rust-uchardet]: https://www.reddit.com/r/rust/comments/2mpedc/rustuchardet_encoding_detection_wrapper_using_ffi/ [Rust-Relay]: https://www.reddit.com/r/rust/comments/2miyr2/rustrelay_an_ircv3_client_library_looking_for/ [cargo-do]: https://www.reddit.com/r/rust/comments/2mwzah/cargo_subcommand_plugin_to_run_multiple_commands/ [dbus-rs]: https://www.reddit.com/r/rust/comments/2n5un5/dbus_bindings_for_rust/ [rusty-abstract-algebra]: https://www.reddit.com/r/rust/comments/2n6ixn/abstract_algebra_traits_escaping_the_paramter_hell/ [wire]: https://www.reddit.com/r/rust_gamedev/comments/2n5749/wire_an_abstraction_over_tcp_and_binary/ ## Project Updates * [This Week in Servo 12][twis]. * [Glium's design choices][glium]. Glium is a safe OpenGL wrapper. [twis]: http://blog.servo.org/2014/11/18/twis-12/ [glium]: https://www.reddit.com/r/rust_gamedev/comments/2mkbs9/gliums_design_choices/