【问题标题】:When does an F# type need to be initialised using new?何时需要使用 new 初始化 F# 类型?
【发布时间】:2010-08-03 17:11:54
【问题描述】:

给定一个类,例如:

type MyClass() =
    member this.Greet(x) = printfn "Hello %s" x

使用初始化实例是否合适

let x = new MyClass()

或者没有new

另外,什么时候使用new 构造函数比使用提供给类型定义的参数的do 绑定更有用?

【问题讨论】:

标签: class f# constructor


【解决方案1】:

我在 F# 中使用 new 的模式是仅在类型实现 IDisposable 时这样做。如果省略new,编译器会使用这种特殊情况并发出警告。

所以在你的情况下,我不会使用new。但是有了以下我会

type OtherClass() =
  ...
  interface System.IDisposable with 
    member this.Dispose() = ...

let x = new OtherClass()

【讨论】:

  • 我想知道为什么会这样。使用use关键字不是很清楚吗?
  • @ChaosPandion,真的不知道。我相信布赖恩很快就会提供完整的历史记录
  • @ChaosPandion:在某些情况下,您不想使用 use 绑定创建新的 IDisposable,例如当您希望它转义创建它的函数时。
  • 我几乎总是说new。我认为如果你有一个与类同名的函数,那么你需要new 来消除歧义。我不知道这里有任何风格指南。
  • @Brian,为什么 F# 编译器选择强制执行这种特定情况?
【解决方案2】:

F# 规范:

68 6.5.2 对象构造表达式 new ty(e1 ... en) 形式的表达式是一个对象构造表达式,它构造一个类型的新实例,通常通过调用该类型的构造方法。

14.2.2 项目限定查找 对象构造 ty(expr) 被当作对象构造函数调用处理,就好像它被写成 new ty(expr)。

如果使用省略 new 关键字的 Ty() 语法创建实现 IDisposable 的类型实例,F# 编译器会发出警告。 Spec 对这个事实只字未提,但我认为应该提到它的定义。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 2015-09-20
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多