澄清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?

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

youcansayyes 回答:澄清F#中的字段类型

首先,您几乎可以忽略valval mutable。这两种代码使用了较旧的语法来定义尚未正式弃用的类,但是在编写新的常规F#代码时,我几乎永远不会使用它(有一些罕见的用例,但我认为不必担心那些)。

这将letlet mutablemembermember val相对。

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

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

  • member this.Foo = (...)定义了只读属性。每当访问该属性时,表达式(...)都会被重复求值。这是.NET属性工作方式的副作用-它们具有隐藏的get()方法,该方法在每次访问它们时都会被调用,因此主体是此方法的主体。

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

    let foo = (...)
    member x.Foo = foo
    
本文链接:https://www.f2er.com/3077419.html

大家都在问