Понимание byref, ref и &

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

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

     let myref = ref 10
    

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

    OK. Поэтому я предполагаю, что ref используется для создания экземпляров типа Ref . Это правильно?

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

     let myref = ref 10
    пусть myval = myref.Value
    пусть myval2 =! myref
    

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

     let myref = ref 10
    myref.Value 

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

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

     let mutable mutvar = 10 ;;
    & a ;;
    

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

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

     let myfunc (x: int byref) =
     х 

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

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

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

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

     type Incrementor (z) =
     член this.Increment (i: int byref) =
     я 

24
задан Sam 15 July 2016 в 12:50
поделиться