2012-12-12 8 views
9

私はf#で "2D Shape editor"というプロジェクトをやっています。私はこのプロジェクトをC#でやったことがあるので、2つの図形をどのように接続するかについてのすべての論理を得ました。だから私は私が追加するすべての形を保持するためのリストが必要になることを知っている。しかし、私は単にaddToListメソッドを動作させることはできません。fのリストに要素を追加する#

マイShapeList:

let mutable ShapeList:List<RectangleZ> = [RectangleZ(100,100)] 

私の追加方法:

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = let ShapeList =  [email protected][element] in ShapeList 
//Method to add into the ShapeList 

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = element::ShapeList 
//Other try on adding into shapeList 

ShapeListに四角形を追加する必要がありますボタン:

btn.Click.Add(fun _ -> new RectangleZ(500, 100) |> addToList ShapeList |>ignore |> saver) 
//Button click method that should be adding the RectangleZ(500, 100) to my ShapeList 

そしてofcourseの私の長方形:

type RectangleZ(x:int, y:int)= 
    let mutable thisx = x 
    let mutable thisy = y 
    let mutable thiswidth = 50 
    let mutable thisheight = 20 
    let brush = new SolidBrush(Color.Black) 
    member obj.x with get() = thisx and set x = thisx <- x 
    member obj.y with get() = thisy and set y = thisy <- y 
    member obj.width with get() = thiswidth and set width = thiswidth <- width 
    member obj.height with get() = thisheight and set height = thisheight <- height 
    member obj.thisColor = Color.FromArgb(167, 198, 253) 
    member obj.draw(paper:Graphics) = paper.FillRectangle(brush, thisx, thisy, 50, 20) 
    member obj.ShapeType = "Rectangle" 

要素は私のaddToList関数で何らかの理由でリストに追加されません。私の質問はなぜですか?

答えて

13

F#のリストは不変です。これは、あなたがこのようにリストに項目を追加するときにすることを意味します

let newlist = elem :: tail;; 

古いリスト(尾)の代わりに作成した新しいリストではなく、変更を行います。だから、あなたはあなたのaddToList関数から新しいリストを返し、変更可能な変数を更新よりも、する必要があります:あなたのコードで

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = element::listan 
ShapeList <- addToList ShapeList newElement 

let ShapeListはローカルであり、グローバルShapeList変数には影響を与えません。あなたはmutableリストとList.appendを使用することができます

+0

うんは、正しく働いていました!私のShapeListはその値を更新するようになりました!ありがとうございました! –

0

は、以下の例では、私と一緒にうまく働い:

let mutable season_averages = [] 
for i in 0 .. n_seasons do 
    season_averages <- [i] |> List.append season_averages 
printfn "Seasons Average: %A" season_averages 
関連する問題