控制对F#类型字段的访问
我正在使用F#为其中一个应用程序编写域逻辑。我想控制对为F#中的类型定义的字段的访问,以便实现构建器模式和控制类型实例化 希望在C#/Java中使用类似于在生成器模式中执行的操作 请建议 e、 g。 让人={ 名称:string 年龄:数目 薪水:string }控制对F#类型字段的访问,f#,f#-interactive,c#-to-f#,f#-3.0,F#,F# Interactive,C# To F#,F# 3.0,我正在使用F#为其中一个应用程序编写域逻辑。我想控制对为F#中的类型定义的字段的访问,以便实现构建器模式和控制类型实例化 希望在C#/Java中使用类似于在生成器模式中执行的操作 请建议 e、 g。 让人={ 名称:string 年龄:数目 薪水:string } 所以我想确保person应该总是用名字和年龄来实例化。但是薪水应该是可选的。实例化应该在构建器模式中进行。正如在一篇评论中指出的,您似乎试图使用没有对象的面向对象模式,这不是一个好主意 如果您决定使用F#类型,您可以这样做: type
所以我想确保person应该总是用名字和年龄来实例化。但是薪水应该是可选的。实例化应该在构建器模式中进行。正如在一篇评论中指出的,您似乎试图使用没有对象的面向对象模式,这不是一个好主意 如果您决定使用F#类型,您可以这样做:
type Employee = {
name: string
age: int
salary: int option
}
let person1 = {
name = "Mike",
age = 42,
salary = Some 4200
}
let person2 = {
name = "Sue",
age = 37,
salary = None
}
type Employee = private {
name: string
age: int
salary: int option
}
let name employee = employee.name
let employee name age = { name = name; age = age; salary = None }
let withSalary salary employee = { employee with salary = Some salary }
let mike = employee "Mike" 42 |> withSalary 4200
mike.name //return name of this employee
省略姓名或年龄会给您一个编译时错误,使用person1或person2而不检查薪水是否存在也是如此
要使用私有数据实现类似于构建器模式的功能,请执行以下操作:
type Employee = {
name: string
age: int
salary: int option
}
let person1 = {
name = "Mike",
age = 42,
salary = Some 4200
}
let person2 = {
name = "Sue",
age = 37,
salary = None
}
type Employee = private {
name: string
age: int
salary: int option
}
let name employee = employee.name
let employee name age = { name = name; age = age; salary = None }
let withSalary salary employee = { employee with salary = Some salary }
let mike = employee "Mike" 42 |> withSalary 4200
mike.name //return name of this employee
正如在一篇评论中指出的,似乎您正在尝试使用没有对象的面向对象模式,这不是一个好主意 如果您决定使用F#类型,您可以这样做:
type Employee = {
name: string
age: int
salary: int option
}
let person1 = {
name = "Mike",
age = 42,
salary = Some 4200
}
let person2 = {
name = "Sue",
age = 37,
salary = None
}
type Employee = private {
name: string
age: int
salary: int option
}
let name employee = employee.name
let employee name age = { name = name; age = age; salary = None }
let withSalary salary employee = { employee with salary = Some salary }
let mike = employee "Mike" 42 |> withSalary 4200
mike.name //return name of this employee
省略姓名或年龄会给您一个编译时错误,使用person1或person2而不检查薪水是否存在也是如此
要使用私有数据实现类似于构建器模式的功能,请执行以下操作:
type Employee = {
name: string
age: int
salary: int option
}
let person1 = {
name = "Mike",
age = 42,
salary = Some 4200
}
let person2 = {
name = "Sue",
age = 37,
salary = None
}
type Employee = private {
name: string
age: int
salary: int option
}
let name employee = employee.name
let employee name age = { name = name; age = age; salary = None }
let withSalary salary employee = { employee with salary = Some salary }
let mike = employee "Mike" 42 |> withSalary 4200
mike.name //return name of this employee
不能将单个记录字段
设置为私有
或内部
,但可以将所有字段设置为私有
或内部
。这将隐藏所有字段,因此您必须公开那些希望作为成员访问的字段。还可以添加静态方法来创建新值。例如:
type Person =
private {
name : string
age : int
salary : int option }
member x.Name = x.name
member x.Age = x.age
member x.Salary = x.salary
static member Create(name:string, age:int) =
{ name = name; age = age; salary = None }
member x.WithSalary(s) =
{ x with salary = Some s }
现在,您无法访问字段或直接创建记录,但可以使用create
和with salary
:
Person.Create("Joe", 60).WithSalary(10000)
不能将单个记录字段
设置为私有
或内部
,但可以将所有字段设置为私有
或内部
。这将隐藏所有字段,因此您必须公开那些希望作为成员访问的字段。还可以添加静态方法来创建新值。例如:
type Person =
private {
name : string
age : int
salary : int option }
member x.Name = x.name
member x.Age = x.age
member x.Salary = x.salary
static member Create(name:string, age:int) =
{ name = name; age = age; salary = None }
member x.WithSalary(s) =
{ x with salary = Some s }
现在,您无法访问字段或直接创建记录,但可以使用create
和with salary
:
Person.Create("Joe", 60).WithSalary(10000)
可以使用普通函数实现生成器模式。我认为没有理由在这里使用对象:
type person =
private {
name: string
age: int
salary: int option
}
let name person = person.name
let age person = person.age
let salary person = person.salary
let create name age =
{ name = name; age = age; salary = None }
let withSalary salary person =
{ person with salary = Some salary }
create "Joe" 60
|> withSalary 10000
|> name
可以使用普通函数实现生成器模式。我认为没有理由在这里使用对象:
type person =
private {
name: string
age: int
salary: int option
}
let name person = person.name
let age person = person.age
let salary person = person.salary
let create name age =
{ name = name; age = age; salary = None }
let withSalary salary person =
{ person with salary = Some salary }
create "Joe" 60
|> withSalary 10000
|> name
如果需要控制访问,则不能使用记录,而应该创建一个对象()。假设构建器模式是面向对象的方法,那么对象无论如何都会更适合。您是想在F#中使用面向对象的方法,还是想使用更具F#-y功能的方法?如果需要控制访问,您不能使用记录,而应该创建一个对象()。假设构建器模式是一种面向对象的方法,那么对象无论如何都会更适合。您是想在F#中使用面向对象的方法,还是想使用更具F#y功能性的方法?