スポンサーリンク

Rustやってみる(6)struct , impl , trait

構造体関連で、struct,impl,trait の役割は以下(だと考えられる)

  • struct ... 構造体を定義
  • impl ... メソッドを定義
  • trait ... structのメソッドに制約をつける

本当はポリモーフィズムをやりたかったがどうしても理解が追い付かなかったので省略。

構造体の定義とインスタンス生成

// #[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() );

}

traitで振る舞いを定義

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() );

}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: