【问题标题】:Need help understanding the F# class syntax需要帮助了解 F# 类语法
【发布时间】:2012-08-26 10:11:48
【问题描述】:

这是关于 F# 类语法的一个非常基本的问题。这是一个小代码来说明我的问题。

type AClass() as self =
    member this.Something = printfn "Hello"

基本上,从我所读的内容来看,“as self”将为当前实例创建一个名称,该名称可在整个类中使用(如 C# 或 Java 中的“this”)。但是“member this.Something”会做同样的事情,只是范围仅限于方法体。我想我可以看到你什么时候会使用哪种语法。如果您在构造函数中需要它,可以使用“as self”,如果在构造函数中不需要它,可以使用另一个。

但为什么我必须使用“成员 this.Something”语法,即使我使用了“as self”语法?如果我只写“member Something”,为什么它会给我一个错误?我错过了什么?

保重, 可儿

【问题讨论】:

  • 实际上,这只是一小部分重复,因为大多数情况下您都希望避免as self

标签: f#


【解决方案1】:

as self 的作用域是整个类,而this.Something 的作用域只是一个单独的方法。您通常不需要as self,因为使用this.Something 就足够了。

关于为什么在成员声明中需要this.,我认为这是一个自然的选择,因为在 F# 类中,您通常也有 let 边界和静态方法。将self 作为默认设置会导致混淆和误用。

这是在MSDN 中使用as self 的示例,这在IMO 中并不常见:

type MyClass2(dataIn) as self =
   let data = dataIn
   do
       self.PrintMessage()
   member this.PrintMessage() =
       printf "Creating MyClass2 with Data %d" data

【讨论】:

  • 所以它或多或少是无害复制的情况?思考它让我意识到,保持一致可能比拥有一个可以确定何时“this”的真正智能编译器更好。是否需要。避免混淆。认为当我在构造函数中需要它并使用“this”时,我只会使用“as self”。别处。谢谢:)。
【解决方案2】:

听起来您已经掌握了全局“as xxx”和成员“yyy”之间的所有区别。实例绑定整理。所以我猜你的答案必须是“设计”。

人们会争辩说,这种“按设计”的选择背后有一种深思熟虑的理性,但经过 4 年的 F# 编程,我迄今为止最喜欢的语言,我个人认为它在任何方面都没有多大帮助。

我怀疑该语言需要显式实例绑定到变量的真正原因是因为它更接近地反映了底层的 .NET CIL 实现。也就是说,像 C# 这样的语言将“this”作为特性绑定到类定义的实例。在底层,类的静态方法和实例方法都使用 Call 和 CallVirt 操作码以相同的方式调用,在实例方法的情况下,“this”的地址作为调用的第一个参数加载。

但我们当然已经冒险进入了品味和意见的领域。

【讨论】:

    【解决方案3】:

    我认为这根本不是重复。 self 对整个类的可见性是 F# 对主要构造函数的“智能”编译的副产品。构造函数的参数/绑定可以隐式编译到本地和成员(类级别)字段。 as identifier 语法仅有助于该突变上下文中的 this 引用。我冒险猜测,如果未使用,它会被编译掉。否则,您所做的只是存储一个对 this 的额外引用作为成员字段(这在另一种语言(例如 C#)中看起来很奇怪)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2016-05-03
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多