// Copyright 2012 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. const tau: float = 2.0*3.14159265358979323; type point = {x: float, y: float}; type size = {w: float, h: float}; enum shape { circle(point, float), rectangle(point, size) } fn compute_area(shape: &shape) -> float { match *shape { circle(_, radius) => 0.5 * tau * radius * radius, rectangle(_, ref size) => size.w * size.h } } impl shape { // self is in the implicit self region fn select(&self, threshold: float, a: &r/T, b: &r/T) -> &r/T { if compute_area(self) > threshold {a} else {b} } } fn select_based_on_unit_circle( threshold: float, a: &r/T, b: &r/T) -> &r/T { let shape = &circle({x: 0.0, y: 0.0}, 1.0); shape.select(threshold, a, b) } struct thing { x: {mut a: @int} } fn thing(x: {mut a: @int}) -> thing { thing { x: copy x } } impl thing { fn foo(@self) -> int { *self.x.a } fn bar(~self) -> int { *self.x.a } fn quux(&self) -> int { *self.x.a } fn baz(&self) -> &self/{mut a: @int} { &self.x } fn spam(self) -> int { *self.x.a } } trait Nus { fn f(&self); } impl thing: Nus { fn f(&self) {} } fn main() { let x = @thing({mut a: @10}); assert x.foo() == 10; assert x.quux() == 10; let y = ~thing({mut a: @10}); assert (copy y).bar() == 10; assert y.quux() == 10; let z = thing({mut a: @11}); assert z.spam() == 11; }