首页 > 解决方案 > 澄清 F# 中的字段类型

问题描述

在使用 F# 进行了一些练习之后,我仍有一些需要澄清的地方:

这个问题专门针对类型中的字段。

这是我的理解,有些肯定是错误的,因为如果我是对的,命名就没有意义:

let x -> private read-only field, evaluated once
let mutable x -> private mutable field

val x -> public read-only field.. difference with let?
val mutable x -> public mutable field

member this.x -> private read-only field, evaluated every time
member val -> public mutable field.. difference with val? why no mutable keyword?

有人可以告诉我什么是对/错,或者我可能弄错了一些概念。

标签: f#field

解决方案


首先,你几乎可以忽略valand val mutable。这两个用于定义未完全正式弃用的类的旧语法,但在编写新的普通 F# 代码时我几乎不会使用它(有一些罕见的用例,但我认为不值得担心那些)。

这留下letlet mutablemembermember val

  • let定义了一个只能在类中访问的私有字段。您分配给它的值会被评估一次。您还可以定义函数,例如let foo x = x + 1let bar () = printfn "hi"具有在调用函数时评估的主体。

  • let mutable定义一个私有的可变字段。这是通过评估右侧来初始化的,但您可以稍后使用fld <- <new value>.

  • member this.Foo = (...)定义了一个 get-only 属性。(...)每当访问该属性时,都会重复计算表达式。这是 .NET 属性工作方式的副作用——它们有一个隐藏get()方法,每当访问它们时都会调用它,因此主体是该方法的主体。

  • member val Foo = (...)是一种编写只评估一次的属性的方法。在早期版本的 F# 中,这是不可用的,因此您必须自己通过定义一个本地字段(运行代码一次)然后从常规属性返回该字段来非常繁琐地实现此功能:

    let foo = (...)
    member x.Foo = foo
    

推荐阅读