2010-09-23 47 views
8

gibi bir şeyF # değişken fonksiyon argümanları

let mutable i = 9 

let somefun n = n <- 12;() 

somefun i 

(* *not* a real-world example *) 

Ben rekor türü içine sararak bu işe yapılabilir anlıyoruz sağlayacak F # değişken fonksiyon argümanları için bir yol var mı

type SomeRec = { mutable i: int } 

let ri = { i = 9 } 

let someotherfun r = r.i <- 12;() 

ve bunun, sınıf üyeleri için benzer bir şekilde yapılabileceğini. Ancak, tüm F # Dil Özelliği (evet, ben yaptım!) Üzerinden göz attıktan sonra bile, ilk durumda izin vermek için bir sözdizimi görünmüyor ve derleyicimin bunu denemem konusunda oldukça mutsuz olduğu görülüyor. Bir çeşit tip ek açıklama olacağını umuyordum, ancak böyle bir durumda değiştirilemez.

Ben de ilk etapta bu tür bir şey yapıyor olması gerektiğini biliyorum ama ilk vaka (int bağlanma) ve ikinci (record tipi) anlamsal olarak aynıdır ve bu tür itiraz Her iki durumda için yapacağını aynı şekilde.

Burada bir şeyleri kaçırdığımı düşünüyorum.

+8

Paramize geçiş yapmanız gerekiyorsa, hala zorunlu olarak düşünmektesiniz. Tam olarak ne yapmaya çalıştığınızı anlatabilir misiniz, belki birileri daha idiomatik bir çözüm önerebilir. – Juliet

cevap

14

Sen ise byref kelime C# ref eşittir argümanlar

let v = ref 0 
let mutate r = 
    r := 100 
mutate v 
printfn "%d" !v 

Veya anahtar kelime

let mutable v = 0 
let mutate (r : byref<_>) = 
    r <- 100 
mutate &v 
printfn "%d" v 
+3

Not 'byref' C#' ref' gibidir. C# 'out' 'a ihtiyacınız varsa,' byref' komutunu kullanın, ancak parametreye '[]' özniteliğini de ekleyin. – Brian

+3

Bu cevap teknik olarak doğrudur, ancak uygulamada kullanıldığını görmeyi engellerdim. OP, biraz farklı bir sözdiziminde C# yazmaya çalışmak yerine F # deyimlerine yapışmalıdır. Bu @Juliet – Juliet

+3

F # işlevsel benzerinden daha * * çok hızlı olabilir. Bunu üretim kodunda kullandım. –

8

byref Kullanımı için ref kullanabilirsiniz. Bkz. "Referans olarak aktarma" bölümü, http://msdn.microsoft.com/en-us/library/dd233213.aspx

+0

Ah canım, hala eksik olduğum oldukça basit bitler var. Sanırım her şeyi tekrar okuyoruz * tekrar *. Üzgünüz, yalnızca bir 'kabul' cevabını işaretleyebilirim, ancak bunu bir oylama yapacaktır. –

+0

sadece başka konuya geçen parametrelere Jon Skeet makalesini buldum: http://www.yoda.arachsys.com/csharp/parameters.html C# üzerinde, ama bu artık ihtiyacım olan şey. –