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

Rust from Python & Ruby

Rust from Python & Ruby

Introduction to Rust for people that use Python and Ruby. Notice that this is about a work in progress Rust around version 0.4. YMMV.

Avatar for Armin Ronacher

Armin Ronacher

November 17, 2012
Tweet

More Decks by Armin Ronacher

Other Decks in Programming

Transcript

  1. fn main() { let s = [1, 2, 3, 4].map(|x|

    (*x * *x).to_str()); for s.each |item| { io::println(*item); } }
  2. fn main() { let s = [1, 2, 3, 4].map(|&x|

    (x * x).to_str()); for s.each |&item| { io::println(item); } } Soon TM
  3. fn main() { let x = 42; let y =

    &x; let &z = y; io::println(fmt!("%d", z + z)); }
  4. $ cat hello.rs fn main() { io::println("Hello World!"); } $

    rustc -g hello.rs $ ./hello Hello World! Compile that
  5. ✤ immutable by default ✤ static, algebraic, locally inferred types

    ✤ no dangling pointers, no overflows ✤ lightweight green tasks ✤ ahead-of-time compiled ✤ C compatible
  6. fn main() { let a = [1, 2, 3].map(|x| {

    *x; }); let b = [1, 2, 3].map(|x| { *x }); io::println(fmt!("a=%? b=%?", a, b)); } /* a=~[ (), (), () ] b=~[ 1, 2, 3 ] */
  7. fn main() { let name = ~"Peter"; let new_name =

    name; io::println(fmt!("Hello %s!", name)); } Does not compile: string (currently) does not copy
  8. fn main() { let name = ~"Peter"; let new_name =

    move name; io::println(fmt!("Hello %s!", name)); } Does not compile: using moved-out value
  9. fn main() { let name = ~"Peter"; let new_name =

    move name; io::println(fmt!("Hello %s!", new_name)); } That compiles!
  10. fn first_larger(seq: &[int], x: int) -> Option<int> { for seq.each

    |item| { if *item > x { return Some(*item); } } None }
  11. fn main() { let rv = first_larger([1, 2, 3, 4,

    5], 3); io::println(match rv { Some(num) => fmt!("Found %d", num), None => ~"No number found" }); }
  12. impl Shape : ToStr { pure fn to_str() -> ~str

    { match self { Point => ~"point", Circle(r) => fmt!("circle of %f", r), Rect(w, h) => fmt!("rect of %f by %f", w, h) } } }
  13. fn main() { let p = Point; let c =

    Circle(4.0f); io::println(fmt!("p=%s, c=%s", p.to_str(), c.to_str())); }
  14. struct Point { mut x: float, mut y: float, }

    impl Point { static fn new(x: float, y: float) -> Point { Point { x: x, y: y } } }
  15. impl Point : ToStr { pure fn to_str() -> ~str

    { fmt!("(%f, %f)", self.x, self.y) } }
  16. fn main() { for ["Peter", "Paul", "Mary"].each |name| { let

    name = *name; do task::spawn { let v = rand::Rng().shuffle([1, 2, 3]); for v.each |num| { io::print(fmt!("%s says: '%d'\n", name, *num)); } } } }
  17. FFI

  18. #[link_args="-lcrypto"] extern { fn SHA1(s: *u8, l: libc::c_uint, d: *u8)

    -> *u8; } fn sha1(data: &str) -> ~str { unsafe { let bytes = str::to_bytes(data); let mut buf = [0u8, ..20]; SHA1(vec::raw::to_ptr(bytes), bytes.len() as libc::c_uint, vec::raw::to_ptr(buf)); as_hex(buf) } }
  19. fn as_hex(data: &[u8]) -> ~str { let mut rv =

    ~""; for data.each |b| { rv += fmt!("%02x", *b as uint); } move rv } fn main() { io::println(sha1("Hello World!")); }