gpt4 book ai didi

class - F#新关键字。这是为了什么

转载 作者:行者123 更新时间:2023-12-03 14:01:03 27 4
gpt4 key购买 nike

在F#类和记录的所有示例中,我看到记录的类是通过new关键字或仅通过类型名称实例化/创建的。

因此,例如,如果我有此记录:

type MyRecord = {field1: int; field2:int}
let myvar = {new MyRecord with field1 = 3 and field2 = 3}
let myvar2 = {MyRecord with field1 = 1 and field2 = 2}
let myvar3 = {field1 = 34; field2 = 23}


他们似乎都是一样的。
此示例也是如此:

type MyClass(x: int) =
let mutable xx = x
let myvar = MyClass(12)
let myvar2 = new MyClassw(234)


那么什么是新的?谢谢

啊...我知道关于类的新问题有答案,但记录中没有提及。此外,我不明白为什么在构造类时,new应该是可选的并且是完全无关紧要的键盘输入?是否有可能在类中使用new或不使用它,什么都不会改变?

最佳答案

new关键字通常不用于实例化F#记录。第一个示例是记录声明的OCaml-ish语法:

let myvar = {new MyRecord with field1 = 3 and field2 = 3}
// Normal F#: let myvar = { MyRecord.field1 = 3; field2 = 3}


第二个示例不再编译:

// Not F#: let myvar2 = {MyRecord with field1 = 1 and field2 = 2}


对于类,您始终可以省略 new。但是,如果实例化 IDisposable类而不使用 new关键字,则会收到编译器警告。

// These two are the same
let myvar = MyClass(12)
let myvar2 = new MyClass(234)

// Compiler warning
let f = FileStream("hello.txt", FileMode.Open)

// No warning
use f = new FileStream("hello.txt", FileMode.Open)


编辑:针对您的评论-


为何没有新规则如此“灵活”的规则或理由?为什么对类使用new还是不使用new


new是可选的-我不知道使其灵活的理由。如果有一种指导或另一种指导,那就太好了。 (除响应编译器警告外,我的首选方法是从不使用 new。)


为什么实现IDisposable时会收到编译器警告


由于我从不正常使用 new,因此我以此为编译器的方式来提醒我在分配 use时编写 usingIDisposable


为什么记录不使用我之前写的第二种语法?


{ new MyRecord with ... }是Haskell语法。它可能在F#编译器beta之一中有效,但不能在F#2.0上解析。 (您为什么认为这应该是正确的?)


我试图找到一个通用的逻辑规则/准则,而不是一堆心地学习一堆或分散的语法规则...


我知道您的感觉-F#有点像这样,特别是当您来自C#之类的语言时,那里有正确的方法和错误的方法来做某事。我的建议是选择一个替代方案并坚持下去。

这可能会有所帮助:Microsoft的 F# Component Design guidelines [PDF]。对于您的F#代码,这是一组建议-注意事项。

关于class - F#新关键字。这是为了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4520640/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com