スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門第47回(構造体)

今回のお題は「構造体」です。
 
構造体は特殊なクラスの一種で、いわば一般のクラスの軽量化版です。どんなところが特殊かというと、主に次の点です。
(1)スタックに値がおかれる。
(2)全部のフィールドがすべて値として等しいとき等しいとされる
(3)継承できない
 
まず、構造体の定義の仕方ですが、普通のクラスを定義するのと同様にしてください。
ただ、typeの前に[<Struct>]をつけるか、body部分をstruct endで囲んでください。

[<Struct>]
type Vec2D (x : float,y:float) =
    member this.ShowContents ()
                = printfn "x = %f y = %f" x y
または
 
type Vec2D (x : float,y:float) =
  struct
    member this.ShowContents ()
                = printfn "x = %f y = %f" x y
  end
  
上の2例では暗黙的定義方法を用いています。(インスタントフィールドx,yが自動生成されています。)
次に明示的定義方法の例をあげてみます。
type Vec2D  =
  struct
    val _x :float
    val _y :float
    
    new (x,y) = {_x = x ; _y = y}
    
    member this.ShowContents ()
                = printfn "x = %f y = %f" this._x this._y
  end 
 
実行例
> let t = new Vec2D (1.0,2.0);;
 
val t : Vec2D = FSI_0007+Vec2D
 
> t;;
x = 1.000000 y = 2.000000
val it : Vec2D = FSI_0007+Vec2D {ShowContents = null;
                                 _x = 1.0;
                                 _y = 2.0;}
 
> t.ShowContents ();;
x = 1.000000 y = 2.000000
val it : unit = ()
 
 
さて、フィールドをmutableにしてみます。
 
type Vec2D  =
  struct
    [<DefaultValue>]
    val mutable _x :float
    [<DefaultValue>]
    val mutable _y :float
    
    member this.ShowContents ()
                = printfn "x = %f y = %f" this._x this._y
  end      
  
コンストラクターを定義していませんが、クラスとは異なり、構造体はデフォルトのコンストラクタを自動的に定義してくれて、これによって各フィールドはゼロかnullに初期化されます。
 
 
使ってみます
 
 > let t = Vec2D ();;
val t : Vec2D = FSI_0002+Vec2D
 
> t.ShowContents() ;;
x = 0.000000 y = 0.000000
val it : unit = () 
 
> t._x <- 5.0;;
  t._x <- 5.0;; 
  error FS0191: A value must be local and mutable in order to mutate the contents of a value type, e.g. 'let mutable x = ...'
とここでエラーです。
エラーメッセージにもあるように、識別子自体もmutable指定していないと、フィールドの値の変更ができません。よって次のようにします。
 
> let mutable u = Vec2D ();;
val mutable u : Vec2D = FSI_0002+Vec2D
 
> u._x <- 5.0;;
val it : unit = ()
 
> u.ShowContents();;
x = 5.000000 y = 0.000000
val it : unit = ()
                         
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。