構造体関連で、struct,impl,trait の役割は以下(だと考えられる)
本当はポリモーフィズムをやりたかったがどうしても理解が追い付かなかったので省略。
// #[derive(Debug)] をつけるとprintln!でそのまま表示できるようになる #[derive(Debug)] // 構造体の定義。 struct Rectangle{ width:i32, height:i32, }
fn main() { // 初期化なしでは定義できない //let mut rr = Rectangle{}; let mut rr = Rectangle{width:0,height:0}; // mut をつけているので代入できる rr.width = 20; rr.height = 20; // #[derive(Debug)] をつけているので {:?} で表示できる println!("{:?}",rr); }
// 構造体の定義 struct Rectangle{ width:i32, height:i32, }
// implの中でメソッドや関連関数を定義 impl Rectangle{ // Rectangleのメソッドを定義 メソッドはselfをとる。 selfがないなら関連関数 fn area(&self)->i32{ return self.width * self.height; } }
fn main() { // インスタンス生成 let mut rr = Rectangle{width:0,height:0}; rr.width = 20; rr.height = 20; // メソッド呼び出し println!("{}",rr.area() ); }
implの中に&selfをとらない関数を定義すると関連関数になる。
新規インスタンスを作成する関連関数を定義する場合、名前をnewにするのが一般的らしい。
呼び出しは 構造体名::関連関数名() となる。
// 構造体の定義 struct Rectangle{ width:i32, height:i32, } impl Rectangle{ // 関連関数。 &selfをとらない。 // Rectangle::new で呼び出す。 // 新規インスタンス生成関連関数は「new」にする習慣がある fn new()->Rectangle{ return Rectangle{width:20,height:30}; } // メソッド fn area(&self)->i32{return self.width * self.height;} }
fn main() { // 関連関数でインスタンス生成 let mut rr = Rectangle::new(); println!("{}",rr.area() ); }
implをbehavior_calc_areaの実装とすることで、areaメソッドの実装を強制することができる。
// 振舞いの定義 trait behavior_calc_area{ fn area(&self)->f32; }
// 構造体の定義 struct Rectangle{ width:i32, height:i32, } // トレイトのR実装 impl behavior_calc_area for Rectangle{ // メソッド fn area(&self)->f32{ return (self.width * self.height) as f32; } }
struct Triangle{ width:i32, height:i32, } // トレイトのR実装 impl behavior_calc_area for Triangle{ // メソッド fn area(&self)->f32{ return (self.width * self.height) as f32 / 2.0 ; } }
fn main() { // インスタンス生成 let t:Triangle = Triangle{width:10,height:5}; let r:Rectangle = Rectangle{width:10,height:5}; println!("{}\n",t.area() ); println!("{}\n",r.area() ); }