F # - передача ссылочных ячеек в функции - PullRequest
2 голосов
/ 03 февраля 2011

Мне просто интересно, может ли кто-нибудь объяснить мне, как передавать ссылочные ячейки функциям, которые не являются членами класса. Я следил за страницей msdn ссылочные ячейки msdn

У меня есть следующий код:

let myint = ref 32
let mutable myint2 = 23

type addone() = 
    member t.myadd1func (x:int byref) = 
        x <- x + 1

let myadd1func (x:int byref) = 
    x <- x + 1

let adder = new addone()

adder.myadd1func myint
// myadd1func myint <---- this line does not compile

myadd1func &myint2 // <----- this line does though


printfn "%d" !myint
printfn "%d" myint2

Мой вопрос ... в чем принципиальная разница между вызовом, который я делаю методу "Myadd1func" в классе, и функцией "myadd1func", определенной после него?

Когда я пишу это, я предполагаю, что функция не любит, когда ей передаются ссылки на объекты .net, поскольку это может нарушить совместимость с другими компонентами IL ?? Я не против использования изменяемого значения, мне просто нравится понимать эти вещи.

Спасибо

Ответы [ 2 ]

5 голосов
/ 03 февраля 2011

Я думаю, что тип byref в F # должен использоваться только для целей взаимодействия, где существующие функции (как объяснено в kvb) достаточно хороши. Если вы хотите объявить функцию, которая изменяет некоторый передаваемый ей аргумент, я бы просто использовал обычную ссылочную ячейку (например, int ref type):

let myadd1func (x:int ref) =
  x := !x + 1 

let myint = ref 10
myadd1func myint

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

1 голос
/ 03 февраля 2011

Это объясняется в разделе Преобразования с указанием типов при вызовах элементов в спецификации F #. Для обеспечения взаимодействия с другими компонентами .NET ячейки ref могут передаваться членам, принимающим параметры byref, и компилятор автоматически обрабатывает это как разыменование поля contents ячейки. Однако это не сделано для функций с привязкой, и вы должны напрямую использовать оператор addressof (&). Вы по-прежнему можете использовать ячейку ref, но вы должны явно разыменовать поле contents самостоятельно, так что это должно работать в вашем примере: myadd1func &myint.contents

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...