我了解到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 Parameters and Arguments提供了以下示例: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