Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust Under the Rug

Rust Under the Rug

Three interesting trade-offs in the design of the Rust programming language.

https://www.youtube.com/watch?v=i9HhyIIueq4

rvidal

May 24, 2018
Tweet

More Decks by rvidal

Other Decks in Programming

Transcript

  1. [rust-dev] RFC: Updated RFC process Brian Anderson banderson at mozilla.com

    Tue Mar 11 18:11:48 PDT 2014 Hey, Rusties. The freewheeling way that we add new features to Rust has been good for early development [...] @brson
  2. struct Leak<T> { cycle: RefCell<Option<Rc<Rc<Leak<T>>>>>, data: T, } fn safe_forget<T>(data:

    T) { let e = Rc::new(Leak { cycle: RefCell::new(None), data: data, }); // Create a cycle *e.cycle.borrow_mut() = Some( Rc::new(e.clone()) ); } @gankro
  3. let mut v = Box::new(10); { let reference = &*v;

    let jg = thread::scoped(move || { println!("{}", reference); }); safe_forget(jg); } *v = 20;
  4. // Automatic (non-)implementations struct Sendable { numbers: Vec<usize> } struct

    NonSendable { shared: Rc<usize> } // Overrides struct YouCanSendThis { numbers: *const usize } unsafe impl Send for YouCanSendThis {} struct DontSendThis { numbers: Vec<usize> } impl !Send for DontSendThis {} // Unstable RFCs #19, #127
  5. pub struct Banana { /* normal(?) stuff */ } trait

    SendForReal : Send {} impl SendForReal for Banana {}
  6. let m = Mutex::new(Cell::new(0)); let g : MutexGuard<Cell<i32>> = m.lock().unwrap();

    { rayon::join( || { g.set(g.get() + 1) }, || { g.set(g.get() + 1) }); } @RalfJung
  7. fn my_api<T>() where T : ?Sized + ?Move + ?Leak

    + ?DynSize More implicit bounds RFC