Просто видел, как я столкнулся с той же проблемой: если у нас есть byref <> в интерфейсе win32 extern, тогда требуется оператор «&», чтобы сообщить компилятору о byref, в противном случае, как сказал Томас, он должен работать с переменными ref. , пусть изменяемый pid = 0u GetWindowThreadProcessId (новый IntPtr (phwnd), & pid) |> игнорировать

понял, что F # может управлять ссылками (что-то вроде ссылок на C ++). Это дает возможность изменять значения параметров, передаваемых в функциях, а также позволяет программисту возвращать более одного значения. Однако вот что мне нужно знать:

Ключевое слово Ref: ключевое словоref используется для создания из значения ссылки на это значение предполагаемого типа. Так

let myref = ref 10

Это означает, что F # создаст объект типаRef<int> положить туда (в изменяемом поле) мойint 10.

ХОРОШО. Итак, я предполагаю, чтоref используется для создания экземпляровRef<'a> тип. Это правильно?

Значение доступа: чтобы получить доступ к значению, сохраненному в ссылке, я могу сделать это:

let myref = ref 10
let myval = myref.Value
let myval2 = !myref

В то время как:= Оператор просто позволяет мне редактировать значение следующим образом:

let myref = ref 10
myref.Value <- 30
myref := 40

Так! (Взрыва) разыменовывает мою ссылку. А также:= отредактируйте это. Я полагаю, это тоже правильно.

Оператор &: что делает этот оператор? Это должно быть применено к ссылочному типу? Нет, я думаю, это должно быть применено к изменяемому значению, и это возвращает что? Ссылка? Адрес? При использовании интерактивного:

let mutable mutvar = 10;;
&a;;

Последняя строка выдает ошибку, поэтому я не понимаю, что& Оператор для.

ByRef: Как насчетbyref? Это очень важно для меня, но я понимаю, что не понимаю этого. Я понимаю, что это используется в функции, касающейся передачи параметров. Каждый использует byref, когда хочет, чтобы переданное значение можно было редактировать (это немного противоречит философии функциональных языков, но f # - нечто большее). Учтите следующее:

let myfunc (x: int byref) =
    x <- x + 10

Это странно. Я знаю, что если у вас есть ссылкаlet myref = ref 10 и затем сделайте это, чтобы отредактировать значение:myref <- 10 возникает ошибка, потому что это должно быть так:myref := 10, Тем не менее, тот факт, что в этой функции я могу редактироватьx с помощью<- оператор означает, чтоx это не ссылка, верно?

Если я предполагаю, чтоx не является ссылкой, то я предполагаю также, что в функциях, при использованииbyref для параметра к этому параметру может применяться изменяемый синтаксис. Так что это просто вопрос синтаксиса, если я предполагаю, что все в порядке, и, на самом деле, все работает (без ошибок компилятора). Тем не менее, что являетсяx?

Вызов функций: как я могу использовать функцию, использующую параметры byref?

& оператор участвует, но не могли бы вы объяснить это лучше, пожалуйста? В этой статье:MSDN Параметры и Аргументы приведен следующий пример:

type Incrementor(z) =
    member this.Increment(i : int byref) =
       i <- i + z

let incrementor = new Incrementor(1)
let mutable x = 10
// A: Not recommended: Does not actually increment the variable. (Me: why?)
incrementor.Increment(ref x)
// Prints 10.
printfn "%d" x  

let mutable y = 10
incrementor.Increment(&y) (* Me: & what does it return? *)
// Prints 11.
printfn "%d" y 

let refInt = ref 10
incrementor.Increment(refInt) (* Why does it not work in A, but here it does? *)
// Prints 11.
printfn "%d" !refInt

Ответы на вопрос(1)

Ваш ответ на вопрос