// Copyright 2013 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. trait Speak { fn say(&self, s:&str) -> ~str; fn hi(&self) -> ~str { hello(self) } } fn hello(s:&S) -> ~str{ s.say("hello") } impl Speak for int { fn say(&self, s:&str) -> ~str { format!("{}: {}", s, *self) } } impl Speak for Option { fn say(&self, s:&str) -> ~str { match *self { None => format!("{} - none", s), Some(ref x) => { "something!".to_owned() + x.say(s) } } } } pub fn main() { assert_eq!(3.hi(), "hello: 3".to_owned()); assert_eq!(Some(Some(3)).hi(), "something!something!hello: 3".to_owned()); assert_eq!(None::.hi(), "hello - none".to_owned()); assert_eq!(Some(None::).hi(), "something!hello - none".to_owned()); assert_eq!(Some(3).hi(), "something!hello: 3".to_owned()); }