Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
控制对F#类型字段的访问_F#_F# Interactive_C# To F#_F# 3.0 - Fatal编程技术网

控制对F#类型字段的访问

控制对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

我正在使用F#为其中一个应用程序编写域逻辑。我想控制对为F#中的类型定义的字段的访问,以便实现构建器模式和控制类型实例化

希望在C#/Java中使用类似于在生成器模式中执行的操作

请建议

e、 g。 让人={ 名称:string 年龄:数目 薪水:string }


所以我想确保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功能性的方法?