Ну, я понял, что 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