Skip to content

Instantly share code, notes, and snippets.

@spastorino
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save spastorino/6873dc7f371fb0fa7651 to your computer and use it in GitHub Desktop.
Save spastorino/6873dc7f371fb0fa7651 to your computer and use it in GitHub Desktop.
Rust by example - http://rustbyexample.com/bounds.html issues
use std::ops::{Add, Sub, Mul};
#[derive(Show, Copy)]
struct Vec2<T> {
x: T,
y: T,
}
// Apply bound to `T` at first instance of `T`. `T`
// must implement the `Add` trait.
impl<T: Add<T, Output = T>> Add<Vec2<T>>
for Vec2<T> {
type Output = Vec2<T>;
fn add(self, rhs: Vec2<T>) -> Vec2<T> {
Vec2 {
// `x` and `y` are of type `T`, and implement the `add` method
x: self.x.add(rhs.x),
// The sugary `+` operator can also be used
y: self.y + rhs.y,
}
}
}
// Bound: `T` must implement the `Sub` trait
impl<T> Sub<Vec2<T>> for Vec2<T>
where T: Sub<T, Output = T> {
type Output = Vec2<T>;
fn sub(self, rhs: Vec2<T>) -> Vec2<T> {
Vec2 {
x: self.x - rhs.x,
y: self.y - rhs.y,
}
}
}
// Bound: `T` must implement *both* the `Add` trait and the `Mul` trait
impl<T> Vec2<T>
where T: Add<T, Output = T> + Mul<T, Output = T> {
fn dot(self, rhs: Vec2<T>) -> T {
(self.x * rhs.x) + (self.y * rhs.y)
}
}
fn main() {
// Floats implement the `Add`, `Mul` and `Sub` traits
let v1 = Vec2 { x: 1.2_f32, y: 3.4 };
let v2 = Vec2 { x: 5.6_f32, y: 7.8 };
println!("{} + {} = {}", v1, v2, v1 + v2);
println!("{} - {} = {}", v1, v2, v1 - v2);
println!("{} â‹… {} = {}", v1, v2, v1.dot(v2));
// Error! `char` doesn't implement the `Add` trait
//println!("{}", Vec2 { x: ' ', y: 'b' } + Vec2 { x: 'c', y: 'd' });
// FIXME ^ Comment out this line
}
Vec2 { x: 1.2, y: 3.4 } + Vec2 { x: 5.6, y: 7.8 } = Vec2 { x: 6.8, y: 11.200001 }
Vec2 { x: 1.2, y: 3.4 } - Vec2 { x: 5.6, y: 7.8 } = Vec2 { x: -4.4, y: -4.4 }
Vec2 { x: 1.2, y: 3.4 } â‹… Vec2 { x: 5.6, y: 7.8 } = 33.240002
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment