Skip to content

Instantly share code, notes, and snippets.

Created April 24, 2016 16:06
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 anonymous/637ad297456f9d85b7e4c46fa99bf3f5 to your computer and use it in GitHub Desktop.
Save anonymous/637ad297456f9d85b7e4c46fa99bf3f5 to your computer and use it in GitHub Desktop.
Shared via Rust Playground
struct Unsigned {
v: u32
}
trait Nat {
fn set(&self, Unsigned) -> (); // accepts any unsigned value
fn get(&self) -> Unsigned; // returns any unsigned value
}
trait Pos {
fn set(&self, Unsigned) -> (); // does not accept the 0 value input
fn get(&self) -> Unsigned; // must only return positive integers > 0
}
trait NatPos: Nat + Pos {
fn set(&self, Unsigned) -> (); // accepts any unsigned value
fn get(&self) -> Unsigned; // returns any unsigned value
}
impl Nat for Unsigned {
fn set(&self, v: Unsigned) -> () {
self.v = v.v;
}
fn get(&self) -> Unsigned { return Unsigned{ v : self.v }; }
}
impl Pos for Unsigned {
fn set(&self, v: Unsigned) -> () {
if v.v < 1 { panic!() }
self.v = v.v;
}
fn get(&self) -> Unsigned { return Unsigned{ v : self.v }; }
}
impl NatPos for Unsigned {
fn set(&self, v: Unsigned) -> () {
self.v = v.v;
}
fn get(&self) -> Unsigned { return Unsigned{ v : self.v }; }
}
fn main() {
let mut x: &NatPos = &Unsigned{ v : 1 };
let z: &Pos = &x;
{
let mut y: &Nat = &x;
y.set(Unsigned{ v : 0});
}
println!("Positive integer: {}", z.get().v); // error! prints "Positive integer: 0"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment