Slide 1

Slide 1 text

Rust An Introduction to

Slide 2

Slide 2 text

“a curly-brace, block-structured expression language”

Slide 3

Slide 3 text

Rust Syntax

Slide 4

Slide 4 text

fn main() { println!("Hello, Vienna.rb!"); }

Slide 5

Slide 5 text

fn is_three(num: int) -> bool { num % 3 == 0 } fn is_five(num: int) -> bool { num % 5 == 0 } fn is_fifteen(num: int) -> bool { num % 15 == 0 } ! fn main() { for num in range(1, 101) { println( if is_fifteen(num) { ~"FizzBuzz" } else if is_three(num) { ~"Fizz" } else if is_five(num) { ~"Buzz" } else { num.to_str() } ); } }

Slide 6

Slide 6 text

match my_number { 0 => println("zero"), 1 | 2 => println("one or two"), 3..10 => println("three to ten"), _ => println("something else") }

Slide 7

Slide 7 text

Memory Safety

Slide 8

Slide 8 text

int *dangling(void)! {! int i = 1234;! return &i;! }! ! int add_one(void)! {! int *num = dangling();! return *num + 1;! }

Slide 9

Slide 9 text

fn dangling() -> &int {! let i = 1234;! return &i;! }! ! fn add_one() -> int {! let num = dangling();! return *num + 1;! }

Slide 10

Slide 10 text

dangling.rs:3:9: 3:11 error: borrowed value does not live long enough dangling.rs:3 return &i; ^~ dangling.rs:1:23: 4:2 note: reference must be valid for the anonymous lifetime #1 defined on the block at 1:22... dangling.rs:1 fn dangling() -> &int { dangling.rs:2 let i = 1234; dangling.rs:3 return &i; dangling.rs:4 } dangling.rs:1:23: 4:2 note: ...but borrowed value is only valid for the block at 1:22 dangling.rs:1 fn dangling() -> &int { dangling.rs:2 let i = 1234; dangling.rs:3 return &i; dangling.rs:4 } error: aborting due to previous error

Slide 11

Slide 11 text

Ownership of memory

Slide 12

Slide 12 text

fn dangling() -> &int {! let i = 1234;! return &i;! }! ! fn add_one() -> int {! let num = dangling();! return *num + 1;! }

Slide 13

Slide 13 text

fn dangling() -> ~int {! let i = ~1234;! return i;! }! ! fn add_one() -> int {! let num = dangling();! return *num + 1;! }

Slide 14

Slide 14 text

// Rust! let i = ~1234;! ! // C++! int *i = new int;! *i = 1234;

Slide 15

Slide 15 text

Concurrency

Slide 16

Slide 16 text

fn main() { let nums = [1, 2]; let noms = ["Tim", "Eston", "Aaron", "Ben"]; let mut odds = nums.iter().map(|&x| x * 2 - 1); for num in odds { do spawn { println!("{:s} says hello from a lightweight thread!", noms[num]); } } }

Slide 17

Slide 17 text

fn main() {! let numbers = [1,2,3];! ! let (port, chan) = Chan::new();! chan.send(numbers);! ! do spawn {! let numbers = port.recv();! println!("{:d}", numbers[0]);! }! }

Slide 18

Slide 18 text

extern mod extra;! use extra::arc::Arc;! ! fn main() {! let numbers = [1,2,3];! ! let numbers_arc = Arc::new(numbers);! ! for num in range(0, 3) {! let (port, chan) = Chan::new();! chan.send(numbers_arc.clone());! ! do spawn {! let local_arc = port.recv();! let task_numbers = local_arc.get();! println!("{:d}", task_numbers[num]);! }! }! }

Slide 19

Slide 19 text

extern mod extra;! use extra::arc::RWArc;! ! fn main() {! let numbers = [1,2,3];! ! let numbers_arc = RWArc::new(numbers);! ! for num in range(0, 3) {! let (port, chan) = Chan::new();! chan.send(numbers_arc.clone());! ! do spawn {! let local_arc = port.recv();! ! local_arc.write(|nums| {! nums[num] += 1! });! ! local_arc.read(|nums| {! println!("{:d}", nums[num]);! })! }! }! }

Slide 20

Slide 20 text

Not Done Yet

Slide 21

Slide 21 text

0.9 stable 0.10-pre

Slide 22

Slide 22 text

Syntax not yet stable

Slide 23

Slide 23 text

https://github.com/mozilla/servo

Slide 24

Slide 24 text

http://www.rustforrubyists.com