Просто видел, как я столкнулся с той же проблемой: если у нас есть 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