(for Java Developers)
JFokus 2017 - #jfokus
#jfokus @hannelita
OSS Projects:
#jfokus @hannelita
#jfokus @hannelita
'Rust is a general purpose programming language, compiled, strong and static typed, sponsored by Mozilla Research. It is designed to be a "safe, concurrent, practical language", supporting functional and imperative-procedural paradigms.'
https://en.wikipedia.org/wiki/Rust_(programming_language)#cite_note-FAQ_-_The_Rust_Project-10
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
Sometimes they are so restrictive that you can't use Java.
Which language do you choose?
Source - http://www.diva-portal.org/smash/get/diva2:215157/FULLTEXT01
#jfokus @hannelita
#jfokus @hannelita
It may be inconvenient.
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
fn main() {
fizzbuzz_to(100);
}
fn is_divisible_by(lhs: u32, rhs: u32) -> bool {
if rhs == 0 {
return false;
}
lhs % rhs == 0
}
fn fizzbuzz(n: u32) -> () {
if is_divisible_by(n, 15) {
println!("fizzbuzz");
} else if is_divisible_by(n, 3) {
println!("fizz");
} else if is_divisible_by(n, 5) {
println!("buzz");
} else {
println!("{}", n);
}
}
fn fizzbuzz_to(n: u32) {
for n in 1..n + 1 {
fizzbuzz(n);
}
}
source: http://rustbyexample.com/fn.html
Limited type inference. Explicit type declaration for function parameters and return.
(same as in Java)
Macros
fn main() {
let _immutable_binding = 1;
let mut mutable_binding = 1;
println!("Before mutation: {}", mutable_binding);
// Ok
mutable_binding += 1;
println!("After mutation: {}", mutable_binding);
// Error!
_immutable_binding += 1;
// FIXME ^ Comment out this line
}
source: http://rustbyexample.com/variable_bindings/mut.html
Immutability by default
fn is_odd(n: u32) -> bool {
n % 2 == 1
}
fn main() {
println!("Find the sum of all the squared odd numbers under 1000");
let upper = 1000;
let mut acc = 0;
for n in 0.. {
let n_squared = n * n;
if n_squared >= upper {
break;
} else if is_odd(n_squared) {
acc += n_squared;
}
}
println!("imperative style: {}", acc);
let sum_of_squared_odd_numbers: u32 =
(0..).map(|n| n * n) // All natural numbers squared
.take_while(|&n| n < upper) // Below upper limit
.filter(|n| is_odd(*n)) // That are odd
.fold(0, |sum, i| sum + i); // Sum them
println!("functional style: {}", sum_of_squared_odd_numbers);
}
source: http://rustbyexample.com/fn/hof.html
High
Order
Functions
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
fn foo() {
let v = vec![1, 2, 3];
let v2 = v;
println!("v[0] is: {}", v[0]);
}
#jfokus @hannelita
fn foo() {
let v = vec![1, 2, 3];
let v2 = v;
println!("v[0] is: {}", v[0]);
}
Rust compiler says:"error: use of moved value: `v` println!("v[0] is: {}", v[0]);"
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
fn main() {
fn sum_vec(v: &Vec<i32>) -> i32 {
return v.iter().fold(0, |a, &b| a + b);
}
fn foo(v1: &Vec<i32>, v2: &Vec<i32>) -> i32 {
let s1 = sum_vec(v1);
let s2 = sum_vec(v2);
s1 + s2
}
let v1 = vec![1, 2, 3];
let v2 = vec![4, 5, 6];
let answer = foo(&v1, &v2);
println!("{}", answer);
}
&
#jfokus @hannelita
(More info: https://users.cs.duke.edu/~chase/cps210-archive/slides/moresync6.pdf )
Rust uses a similar model at compile time.
Rust uses a similar model at compile time.
T: Base type; owns a value
&T: Shared reader
&mut T: Exclusive writer
(Note: I am not considering another Rust feature called Copy)
Rust uses a similar model at compile time.
T: Base type; owns a value
&T: Shared reader
&mut T: Exclusive writer
(Note: I am not considering another Rust feature called Copy)
Immutable reference
Mutable reference
fn main() {
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x);
}
Rust compiler says: "error: cannot borrow `x` as immutable because it is also borrowed as mutable println!("{}", x);"
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
fn lifetimes() {
let a1 = vec![1, 2, 3]; // +
let a2 = vec![4, 5, 6]; // + |
// | |
let b1 = &a1; // + | |
let b2 = &a2; // + | | |
foo(b1); // | | | |
foo(b2); // 'b2 'b1 'a2 'a1
// | | | |
}
#jfokus @hannelita
fn explicit_lifetime<'a>(x: &'a i32) {
}
fn multiple_lifetimes<'a, 'b>(x: &'a str, y: &'b str) -> &'a str {
}
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
http://huonw.github.io/blog/2015/05/finding-closure-in-rust/
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
public class MyClass {
private in number = 42;
private MyOtherClass c =
new MyOtherClass();
public int count() {
..
}
}
struct MyClass {
number: i32,
other: MyOtherClass,
}
impl MyClass {
fn myMethodCountHere(&self) -> i32 {
...
}
}
Primitive types
Primitive types
#jfokus @hannelita
public interface MyInterface {
void someMethod();
default void someDefault(String str){
//implementation
}
}
trait Animal {
fn noise(&self) -> &'static str;
fn talk(&self) {
println!("I do not talk to humans");
}
}
struct Horse { breed: &'static str }
impl Animal for Horse {
fn noise(&self) -> &'static str {
"neigh!"
// I can't mimic horse sounds
}
fn talk(&self) {
println!("{}!!!!", self.noise());
}
}
impl Horse {
fn move(&self) {
//impl
}
}
#jfokus @hannelita
public class MyGeneric<T> {
//impl
}
public class NotGeneric {
public static <T extends Comparable<T>> T maximum(T x, T y) {
//awesome
}
}
trait Traverse<I> {
// methods
}
struct Bag<T> {
//struct
}
impl<T> Bag<T> {
//impl
}
#jfokus @hannelita
fn general_method<T: MyTrait>(t: T) { ... }
fn general_method<T: MyTrait + AnotherTrait + SomeRandomTrait>(t: T)
(Trait bounds: use it for the good and for the evil)
#jfokus @hannelita
Arrays
Mutability
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
fn main() {
let u: &[u8] = &[49, 50, 51];
unsafe {
assert!(u == std::mem::transmute::<&str, &[u8]>("123"));
}
}
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
#jfokus @hannelita
https://www.ralfj.de/blog/2015/10/12/formalizing-rust.html
#jfokus @hannelita
#jfokus @hannelita
source: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=rust&lang2=java
Free GIF!
Questions?
hannelita@gmail.com
@hannelita