Created
April 24, 2016 16:06
-
-
Save anonymous/637ad297456f9d85b7e4c46fa99bf3f5 to your computer and use it in GitHub Desktop.
Shared via Rust Playground
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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