F# 可以更新 class 中的不可变绑定(创建一个更改了指定绑定的新对象吗?)
Can F# update immutable bindings in a class (create a new object with the specified bindings changed?)
有没有办法让 F# 更新 class 中的不可变绑定?或者,更具体地说,有没有办法复制 class 定义并更改单个不可变条目?比如在OCaml中,我们可以这样写代码
let foo = object
val fuz = 1
method get_fuz = fuz
method inc_fuz = {< fuz = fuz+1 >}
end
let _ = foo#get_fuz
let foo = foo#inc_fuz
let _ = foo#get_fuz
这个程序产生
val foo : < get_fuz : int; inc_fuz : 'a > as 'a = <obj>
- : int = 1
val foo : < get_fuz : int; inc_fuz : 'a > as 'a = <obj>
- : int = 2
基本上,语法 {< >}
允许我们在某种意义上更新不可变属性,方法是创建一个新对象,其中所有相同的条目都已更改,但指定的条目已更改。 F#中有类似的操作吗?
在这种情况下,Christian 是对的,您通常会这样做:
使用 record/function
type foo = { fuz : int }
let inc_fuz f = { f with fuz = f.fuz + 1 }
测试:
> inc_fuz { fuz = 5 }
val it : foo = {fuz = 6;}
使用会员记录
of 如果它必须是成员:
type foo =
{ fuz : int }
member f.inc_fuz = { f with fuz = f.fuz + 1 }
测试:
> let test = { fuz = 5 };;
val test : foo = {fuz = 5;}
> test.inc_fuz;;
val it : foo = {fuz = 6;}
有没有办法让 F# 更新 class 中的不可变绑定?或者,更具体地说,有没有办法复制 class 定义并更改单个不可变条目?比如在OCaml中,我们可以这样写代码
let foo = object
val fuz = 1
method get_fuz = fuz
method inc_fuz = {< fuz = fuz+1 >}
end
let _ = foo#get_fuz
let foo = foo#inc_fuz
let _ = foo#get_fuz
这个程序产生
val foo : < get_fuz : int; inc_fuz : 'a > as 'a = <obj>
- : int = 1
val foo : < get_fuz : int; inc_fuz : 'a > as 'a = <obj>
- : int = 2
基本上,语法 {< >}
允许我们在某种意义上更新不可变属性,方法是创建一个新对象,其中所有相同的条目都已更改,但指定的条目已更改。 F#中有类似的操作吗?
在这种情况下,Christian 是对的,您通常会这样做:
使用 record/function
type foo = { fuz : int }
let inc_fuz f = { f with fuz = f.fuz + 1 }
测试:
> inc_fuz { fuz = 5 }
val it : foo = {fuz = 6;}
使用会员记录
of 如果它必须是成员:
type foo =
{ fuz : int }
member f.inc_fuz = { f with fuz = f.fuz + 1 }
测试:
> let test = { fuz = 5 };;
val test : foo = {fuz = 5;}
> test.inc_fuz;;
val it : foo = {fuz = 6;}