f# - 澄清 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?
有人可以告诉我什么是对/错,或者我可能弄错了一些概念。
解决方案
首先,你几乎可以忽略val
and val mutable
。这两个用于定义未完全正式弃用的类的旧语法,但在编写新的普通 F# 代码时我几乎不会使用它(有一些罕见的用例,但我认为不值得担心那些)。
这留下let
和let mutable
与member
和member val
。
let
定义了一个只能在类中访问的私有字段。您分配给它的值会被评估一次。您还可以定义函数,例如let foo x = x + 1
或let 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
推荐阅读
- python - 将系列对象转换为 json 并将其写入本地驱动器
- java - 当 Selenium 驱动程序在 Java 中通过 VPN 运行时出现 W3CHttpResponseCodec 错误
- python - 具有分层折叠的嵌套交叉验证
- laravel - 根据 Laravel 7 中的下拉值重新绘制视图
- visual-studio - 如何在 Visual Studio 安装程序 2015 中使用 now 安装程序覆盖服务器
- ios - 如何为动态键、json解析、swift5创建模型
- python - 在数据框中绘制数据时需要帮助
- excel - Excel 无法访问 ssas 多维数据集
- java - 用 spark 实现散列
- oauth-2.0 - 没有发现文档的 angular-oidc 库代码流