首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解参考文献、参考文献和&

了解参考文献、参考文献和&
EN

Stack Overflow用户
提问于 2011-02-17 11:32:51
回答 1查看 6.9K关注 0票数 28

嗯,我开始理解F#能够管理引用(某种类似于引用的C++ )。这使得可以更改函数中传递的参数的值,并使程序员能够返回多个值。然而,我需要知道的是:

  1. Ref关键字:关键字ref用于从值创建对推断类型的值的引用。所以 让myref =参10 这意味着F#将创建一个Ref<int>类型的对象(在可变字段中)-- my int 10。 好的。因此,我假设ref用于创建Ref<'a>类型的实例。这是正确的吗?
  2. 访问值:为了访问存储在引用中的值,我可以这样做: 让myref = ref 10让myval = myref.Value myval2 = !myref 虽然:=操作符只允许我像下面这样编辑值: 设myref = ref 10 myref.Value <- 30 myref := 40 所以! (Bang)取消了我的参考。然后:=编辑它。我想这也是对的。
  3. 接线员:这个操作员是做什么的?它适用于引用类型吗?不,我想它必须应用到一个可变的值中,这会返回什么?推荐信?地址?如果使用交互式的: 设可变变量= 10;;&a; 最后一行将抛出一个错误,因此我不理解&操作符的作用。
  4. ByRef:那byref呢?这对我来说很重要,但我意识到我不明白。据我所知,它是用于有关参数传递的函数。当一个人想要编辑传递的值时,他会使用byref (这有点违背了函数式语言的哲学,但f#不仅仅是这样)。请考虑以下几点: 设myfunc (x: int )=x <- x+ 10 这很奇怪。我知道,如果您有一个引用let myref = ref 10,然后执行此操作来编辑值:myref <- 10,则会产生一个错误,因为它应该是这样的:myref := 10。但是,在这个函数中,我可以使用x操作符编辑<-,这意味着x不是引用,对吗? 如果我假设x不是引用,那么我还假设,在函数中,当对参数使用byref时,该参数可以应用可变的语法。因此,这只是语法问题,如果我假设这一点,我是好的,事实上,一切正常(没有编译器错误)。然而,什么是x
  5. 调用函数:如何使用使用byref参数的函数? 涉及到&接线员,但你能解释得更清楚些吗?在本文: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!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-17 11:54:02

Ref关键字是的,在编写let a = ref 10时,本质上是在编写let a = new Ref<int>(10),其中Ref<T>类型具有可变字段Value

访问值 :=!运算符只是编写以下内容的捷径:

代码语言:javascript
运行
复制
a.Value <- 10  // same as writing: a := 10
a.Value        // same as writing: !a

ByRef是一种特殊的类型,只能在方法参数中(合理地)使用。这意味着该参数实质上应该是指向某个内存位置(在堆或堆栈上分配)的指针。它对应于outref修饰符在C#中。请注意,不能创建此类型的局部变量。

& operator是一种创建值(指针)的方法,该值可以作为参数传递给期望byref类型的函数/方法。

调用函数使用byref的示例工作,因为您要将方法传递给本地可变变量的引用。通过引用,该方法可以更改存储在该变量中的值。

以下内容不起作用:

代码语言:javascript
运行
复制
let a = 10            // Note: You don't even need 'mutable' here
bar.Increment(ref a)  

原因是您正在创建Ref<int>的一个新实例,并且正在将a的值复制到这个实例中。然后,Increment方法修改Ref<int>实例中堆中存储的值,但是不再有对该对象的引用。

代码语言:javascript
运行
复制
let a = ref 10
bar.Increment(a)  

这是可行的,因为aRef<int>类型的值,您将指向堆分配实例的指针传递给Increment,然后使用!a从堆分配的引用单元中获取值。

(您可以使用使用ref创建的值作为byref的参数,因为编译器专门处理这种情况--它将自动引用Value字段,因为这是一个有用的场景.)。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5028377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档