Inheritance 创建具有常量值的F#记录类型
假设我有一个记录被如此定义Inheritance 创建具有常量值的F#记录类型,inheritance,f#,recordtype,Inheritance,F#,Recordtype,假设我有一个记录被如此定义 type Employee = {Name : string; Salary : int} 我想要另一种类型,其中工资是固定的。我想说 type Manager = {Name: string; Salary : int = 250000} ……但我似乎不能 要获得这种行为,我必须具备哪些选项?F#记录是不可变的,因此用您的话说,所有字段值都是“固定”的 如果您的目标是避免在构建时指定工资,最简单的方法是创建一个“构造函数”: 注1。我使用了Manager.Nam
type Employee = {Name : string; Salary : int}
我想要另一种类型,其中工资是固定的。我想说
type Manager = {Name: string; Salary : int = 250000}
……但我似乎不能
要获得这种行为,我必须具备哪些选项?F#记录是不可变的,因此用您的话说,所有字段值都是“固定”的
如果您的目标是避免在构建时指定工资
,最简单的方法是创建一个“构造函数”:
注1。我使用了Manager.Name
,这样它就不会干扰员工的构建
附注2。此外,这种方法甚至不会阻止保留一个类型的员工
,这也将优雅地处理经理的创建;只需调用该方法,例如MakeManager
,以明确说明问题
静态
方法并不禁止某人(使用您的库的开发人员)手动创建工资不正确的经理
。有关如何防止此类创建的信息,请参阅。记录类型可以有成员,例如
type Employee = {Name : string; Salary : int}
type Manager =
{Name: string; }
member x.Salary with get() = 250000
let manager1 = {Manager.Name = "manager1"}
let manager2 = { manager1 with Manager.Name = "manager2"}
let salary = manager1.Salary // fsi: val salary : int = 250000
但在这里,如果经理是雇员,我会使用普通类和继承而不是记录。使用F#中的普通类是很好的,避免使用公共setter可以实现不变性。您可以为记录提供一个只读属性:
type Manager =
{
Name: string
}
member this.Salary = 250000
FSI示例:
> let m = { Name = "Foo" };;
val m : Manager = {Name = "Foo";}
> m.Name;;
val it : string = "Foo"
> m.Salary;;
val it : int = 250000
答对 了我要这个,希曼先生。顺便说一句,你在Pluralsight上的TDD F#课程做得很棒。刚刚看完。是不是第一个代码示例缺少了一个带有的?或者写这篇文章时不需要带
的?当我今天尝试它时,如果没有
@RyanLundy的
,它是不会接受的。我刚刚从F#脚本文件以及F#Interactive中尝试过,上面的语法在这两种情况下都对我有效…@MarkSeemann好的,我知道发生了什么…有多奇怪。我在=
后面有一个大括号。这样做需要使用
和
的,但使用大括号和上面的大括号完全一样,这不是必需的。
> let m = { Name = "Foo" };;
val m : Manager = {Name = "Foo";}
> m.Name;;
val it : string = "Foo"
> m.Salary;;
val it : int = 250000