2010-09-23 36 views
8

Czy istnieje sposób, aby mieć zmienny argumentów funkcji w F #, który pozwoliłby cośF # argumenty funkcji zmienny

let mutable i = 9 

let somefun n = n <- 12;() 

somefun i 

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

rozumiem, że to może być wykonane do pracy przez owinięcie go do typu rekordu

type SomeRec = { mutable i: int } 

let ri = { i = 9 } 

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

i że można to zrobić w podobny sposób dla członków klasy. Jednak nawet po przejrzeniu całej specyfikacji języka F # (tak, zrobiłem to!), Wydaje się, że nie ma żadnej składni, aby pozwolić na pierwszy przypadek, a kompilator wydaje się być niezadowolony z tego, że próbuję to zrobić. Miałem nadzieję, że będzie jakaś adnotacja typu, ale zmienna nie może być w tym użyta.

wiem też, że nie należy robić tego typu rzeczy w pierwszej kolejności, ale to pierwszy przypadek (int wiążący) i drugi (record typ) są semantycznie identyczne, a każdy taki sprzeciw będzie posiadać na obu przypadkach na równi.

Więc myślę, że czegoś tu brakuje.

+8

Jeśli chcesz zmutować swoje parametry, nadal myślisz koniecznie. Czy możesz opisać dokładnie to, co próbujesz zrobić, może ktoś zaproponuje bardziej idiomatyczne rozwiązanie. – Juliet

Odpowiedz

14

Można użyć ref jako argumenty

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

Albo ByRef hasła

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

Zauważ, że 'byref' jest jak C#' ref'. Jeśli potrzebujesz C# 'out', użyj' byref', ale dodaj także parametr '[]'. – Brian

+3

Ta odpowiedź jest technicznie poprawna, ale wzdrygnęłabym się widząc, że jest używana w praktyce. OP powinien trzymać się idiomów F # zamiast próbować pisać C# w nieco innej składni. – Juliet

+3

@Juliet Może to być * dużo * szybciej niż funkcjonalny odpowiednik w F #. Użyłem tego w kodzie produkcji. –

8

użytkowania byref słów kluczowych, która jest równa C# ref. Zobacz sekcję "Przekazywanie odniesienia" pod numerem http://msdn.microsoft.com/en-us/library/dd233213.aspx

+0

Och kochanie, wciąż brakuje mi podstawowych bitów. Myślę, że wróciłem do czytania całej rzeczy * ponownie *. Przykro mi, mogę tylko oznaczyć jedną "zaakceptowaną" odpowiedź, ale zagłosuję na tę. –

+0

Właśnie znalazłem artykuł Jona Skeeta na temat parametrów przekazywanych w innym temacie: http://www.yoda.arachsys.com/csharp/parameters.html Jest na C#, ale to jest właśnie to, czego potrzebujesz teraz. –