スポンサーサイト

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

F#入門第30回(命令型プログラミング(2)可変レコード(mutable record))

今回のお題は「命令型プログラミング(2)可変レコード(mutable record)」です。
 
まずは宿題の解答から
宿題 次のプログラムを実行すると、なんと表示されるでしょうか?
 
let testSub rl =
    rl := 1 :: !rl
 
let test  () =
    let refLst = ref [2;3]
    let t = refLst
    testSub (t)
    printfn "%A" refLst.Value
 
test ()
 
解説
まずtestSubの内容ですが、
int list ref型の引数rlにたいして、
1 :: !rlで、rlの指し示す内容であるint listの先頭に1を挿入します。
そして、それを、rlの指し示す内容として、設定し直します。
次にtestの方ですが、let refLst = ref [2;3]で、[2;3]をcell化して、それへのポインタをrefLstとします。つぎのlet t = refLstで、ポインタとして同じものとしてtが設定されます。(ここで、refLstとtの指し示す内容は同じものとなります。)
このポインタがtestSubに渡されますので、tの指し示す内容(=refLstの指し示す内容)の先頭に1が挿入されます。
よって結果として[1;2;3]と表示されます。
 
さて、今回の話題です。
レコード型というのは、次のように定義し、使用するのでした。
 
type person = {
    id : int
    name : string
    height : float
    }
 
let t = {id = 123 ; name = "Ben"; height = 72.3 }
 
ここで,定義にキーワードmutableを加えることにより任意のフィールドをmutableにすることができます。heightフィールドをmutableとするには次のようにします。
 
type person = {
    id : int
    name : string
    mutable height : float
    }
 
これで、heightフィールドが変更可能になりました。テストしてみます。
 
> let p1 = { id = 1 ; name = "Ben" ; height = 169.9};;
 
val p1 : person = {id = 1;
                   name = "Ben";
                   height = 169.9;}
 
> printfn "%A" p1;;
{id = 1;
 name = "Ben";
 height = 169.9;}
val it : unit = ()
 
> p1.height <- 170.0;;
val it : unit = ()
 
> printfn "%A" p1;;
 
{id = 1;
 name = "Ben";
 height = 170.0;}
val it : unit = ()
 
きちんと、heightフィールドだけ変更できています。 
  
 
宿題 次のプログラムを実行すると、なんと表示されるでしょうか?
 
type person = {
    id : int
    name : string
    mutable height : float
    }
 
let testSub (lp : person) =
    lp.height <- lp.height + 10.0
    
 
let test () =
    let p1 = { id = 1 ; name = "Ben" ; height = 169.9}
    let p2 = p1
    testSub  p2
    printfn "%A" p1
   
 
test ()
 
スポンサーサイト

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

コメントの投稿

非公開コメント

オブジェクトの同一性とmutable

>レコードにmutableなフィールドが一つでも、あると、識別子はポインタの役割を持つのです。
mutable なフィールドのあるなしにかかわらず、
let p2 = p1
としているために、同一のオブジェクトを指しているためです。
オブジェクトが同一であるかどうかは、
System.Object.ReferenceEquals(p1,p2)
のようにしてテストできます。
mutable 指定のフィールドが無い場合もtrue になることが確認できます。

No title

おっしゃる通りです。勘違いしていました。御指摘ありがとうございます。本文も直しました。(というより一部削除しました。)
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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