I like Rust
Speed, Safety and Concurrency
Zero-cost abstractions
A simple trait
trait Foo {
fn bar(&self);
}
Static dispatch
fn call_bar<T: Foo>(t: T) {
t.bar()
}
A unit-like struct
struct Foo { }
- as of Rust 1.8, this syntax is valid
Zero sized!
assert!(size_of::<Foo>() == 0)
- uses up no bytes, but gives the compiler plenty of information!
Stateless trait implementations
impl Bar for Foo {
fn bar(&self) {
// magic here
}
}
- useful for implementations of traits that require no state
A tuple struct with one element!
struct FooBar(usize);
No memory overhead!
assert!(size_of::<FooBar>() == size_of::<usize>())
- it has no memory overhead, but a different type identity
Validated types
impl Vector {
pub fn normalize(self) -> UnitVector {
UnitVector::from(self)
}
}
- useful to assert compile time guarantees that the type has some
useful properties
- also limits operations between the newtypes and ordinary types,
unless the operations are defined (like Add/Sub impls)
Stateless decorators
struct LogFoo<T: Foo>(T);
impl<T: Foo> Foo for LogFoo<T> {
fn bar(&self) -> Bar {
let bar = self.0.bar();
println!("result of foo: {:?}", bar);
return bar;
}
}
- complements the Trait system very well
- highly composable
std::cell::Ref
pub struct Ref<'b, T> where T: 'b + ?Sized {
// some fields omitted
}
- reference types
- acts much like a borrow
Projections
struct Polygon(Vec<Point>);
struct PolygonEdge<'a>(&'a Point, &'a Point);
struct SubPolygon<'a>(Vec<&'a Point>);
- complex projections of the data onto simpler types
- powerful abstraction without the cost of copying data
This slide is intentionally left blank
Useful links
Summary
Any questions?