Ну, я понял, что F # умеет управлять ссылками (как-то вроде ссылок на С++). Это позволяет изменять значение параметров, передаваемых в функции, а также позволяет программисту возвращать более одного значения. Однако вот что мне нужно знать:
-
Ссылка на ключевое слово: Ключевое слово
ref
используется для создания из значения ссылки на это значение выводимого типа. Такlet myref = ref 10
Это означает, что F # создаст объект типа
Ref<int>
, поместив туда (в изменяемое поле) myint 10
.OK. Поэтому я предполагаю, что
ref
используется для создания экземпляров типаRef<'a>
. Правильно ли это? -
Значение доступа: для доступа к значению, хранящемуся в ссылке, я могу сделать это:
let myref = ref 10 let myval = myref.Value let myval2 = !myref
В то время как оператор
:=
позволяет мне изменить значение, подобное этому:let myref = ref 10 myref.Value <- 30 myref := 40
Итак
!
(Bang) разыгрывает мою ссылку. И:=
отредактируйте его. Я полагаю, это тоже правильно. -
Оператор и оператор: что делает этот оператор? Должен ли он применяться к эталонному типу? Нет, я думаю, это должно быть применено к изменяемому значению, и это возвращает что? Ссылка? Адрес? Если вы используете интерактивный интерфейс:
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
для параметра этот параметр может иметь применяемый mutable синтаксис. Так что это всего лишь вопрос синтаксиса, если я предполагаю, что это нормально, и на самом деле все работает (ошибок компилятора нет). Однако что такое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