嗯,我开始理解F#能够管理引用(某种类似于引用的C++ )。这使得可以更改函数中传递的参数的值,并使程序员能够返回多个值。然而,我需要知道的是:
ref用于从值创建对推断类型的值的引用。所以
让myref =参10
这意味着F#将创建一个Ref<int>类型的对象(在可变字段中)-- my int 10。
好的。因此,我假设ref用于创建Ref<'a>类型的实例。这是正确的吗?:=操作符只允许我像下面这样编辑值:
设myref = ref 10 myref.Value <- 30 myref := 40
所以! (Bang)取消了我的参考。然后:=编辑它。我想这也是对的。&操作符的作用。byref呢?这对我来说很重要,但我意识到我不明白。据我所知,它是用于有关参数传递的函数。当一个人想要编辑传递的值时,他会使用byref (这有点违背了函数式语言的哲学,但f#不仅仅是这样)。请考虑以下几点:
设myfunc (x: int )=x <- x+ 10
这很奇怪。我知道,如果您有一个引用let myref = ref 10,然后执行此操作来编辑值:myref <- 10,则会产生一个错误,因为它应该是这样的:myref := 10。但是,在这个函数中,我可以使用x操作符编辑<-,这意味着x不是引用,对吗?
如果我假设x不是引用,那么我还假设,在函数中,当对参数使用byref时,该参数可以应用可变的语法。因此,这只是语法问题,如果我假设这一点,我是好的,事实上,一切正常(没有编译器错误)。然而,什么是x?&接线员,但你能解释得更清楚些吗?在本文:MSDN参数和参数中,提供了以下示例:
类型Incrementor(z) =成员this.Increment(i : int )=i <- i+z让增量器=新的增量器(1)让可变的x= 10 // A: Not :不实际增加变量。(我:为什么?)incrementor.Increment(ref x) // Prints 10. printfn "%d“x让可变的y= 10 incrementor.Increment(&y) (* Me:&它返回什么?*) //打印11. printfn "%d”refInt = ref 10 incrementor.Increment(refInt) (*为什么它在A中不工作,但在这里却工作?*) //打印11. printfn "%d“!refInt!发布于 2011-02-17 11:54:02
Ref关键字是的,在编写let a = ref 10时,本质上是在编写let a = new Ref<int>(10),其中Ref<T>类型具有可变字段Value。
访问值 :=和!运算符只是编写以下内容的捷径:
a.Value <- 10 // same as writing: a := 10
a.Value // same as writing: !aByRef是一种特殊的类型,只能在方法参数中(合理地)使用。这意味着该参数实质上应该是指向某个内存位置(在堆或堆栈上分配)的指针。它对应于out和ref修饰符在C#中。请注意,不能创建此类型的局部变量。
& operator是一种创建值(指针)的方法,该值可以作为参数传递给期望byref类型的函数/方法。
调用函数使用byref的示例工作,因为您要将方法传递给本地可变变量的引用。通过引用,该方法可以更改存储在该变量中的值。
以下内容不起作用:
let a = 10 // Note: You don't even need 'mutable' here
bar.Increment(ref a) 原因是您正在创建Ref<int>的一个新实例,并且正在将a的值复制到这个实例中。然后,Increment方法修改Ref<int>实例中堆中存储的值,但是不再有对该对象的引用。
let a = ref 10
bar.Increment(a) 这是可行的,因为a是Ref<int>类型的值,您将指向堆分配实例的指针传递给Increment,然后使用!a从堆分配的引用单元中获取值。
(您可以使用使用ref创建的值作为byref的参数,因为编译器专门处理这种情况--它将自动引用Value字段,因为这是一个有用的场景.)。
https://stackoverflow.com/questions/5028377
复制相似问题