2010-09-23 50 views
8

Có cách nào để có đối số chức năng có thể thay đổi trong F #, mà sẽ cho phép một cái gì đó giống nhưF # chức năng có thể thay đổi đối số

let mutable i = 9 

let somefun n = n <- 12;() 

somefun i 

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

Tôi hiểu rằng điều này có thể được thực hiện để làm việc bằng cách gói nó thành một loại bản ghi

type SomeRec = { mutable i: int } 

let ri = { i = 9 } 

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

và điều này có thể được thực hiện theo cách tương tự cho các thành viên của lớp học. Tuy nhiên, ngay cả sau khi duyệt qua toàn bộ Đặc tả Ngôn ngữ F # (vâng, tôi đã làm!), Dường như không có cú pháp nào để cho phép trường hợp đầu tiên, và trình biên dịch dường như không hài lòng về việc thử nó. Tôi đã hy vọng sẽ có một số loại chú thích, nhưng có thể biến đổi không thể được sử dụng trong đó. Tôi cũng biết rằng tôi không nên làm điều này ở nơi đầu tiên, nhưng trường hợp đầu tiên (int ràng buộc) và thứ hai (loại record) là giống hệt về mặt ngữ nghĩa, và bất kỳ phản đối như vậy sẽ giữ cho cả hai trường hợp như nhau.

Vì vậy, tôi nghĩ rằng tôi đang thiếu thứ gì đó ở đây.

+8

Nếu bạn cần thay đổi thông số của mình, bạn vẫn đang suy nghĩ bất hợp pháp. Bạn có thể mô tả chính xác những gì bạn đang cố gắng làm, có lẽ ai đó có thể đề xuất một giải pháp thành ngữ hơn thay thế. – Juliet

Trả lời

14

Bạn có thể sử dụng ref như các đối số

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

Hoặc ByRef từ khóa

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

Lưu ý 'byref' giống như C#' ref'. Nếu bạn cần C# 'out', sau đó sử dụng' byref' nhưng cũng thêm thuộc tính '[]' vào tham số. – Brian

+3

Câu trả lời này là chính xác về mặt kỹ thuật, nhưng tôi sẽ thấy nó được sử dụng trong thực tế. OP nên dính vào thành ngữ F # thay vì cố gắng viết C# theo một cú pháp khác. – Juliet

+3

@Juliet Điều này có thể là * * * nhanh hơn chức năng tương đương trong F #. Tôi đã sử dụng điều này trong mã sản xuất. –

8

Sử dụng byref từ khóa đó là tương đương với C# ref. Xem phần "Đi qua tham chiếu" tại http://msdn.microsoft.com/en-us/library/dd233213.aspx

+0

Oh thân yêu, vẫn còn khá bit cơ bản tôi đang mất tích. Tôi đoán nó quay trở lại để đọc toàn bộ điều * một lần nữa *. Xin lỗi, tôi chỉ có thể đánh dấu một câu trả lời 'được chấp nhận', nhưng sẽ bỏ phiếu cho câu trả lời này. –

+0

Tôi chỉ tìm thấy bài viết của Jon Skeet về các thông số đi qua trong một chủ đề khác: http://www.yoda.arachsys.com/csharp/parameters.html Đó là trên C#, nhưng đây chỉ là những gì bạn cần bây giờ. –

Các vấn đề liên quan