在 F# 中对类型中的静态字典感到困惑
Confused about static dictionary in a type, in F#
使用此类型:
type A =
{
S: string
}
static member private l = Dictionary<string, A>()
static member add s = A.l.[s] <- { S=s }
static member list () = l.Values
如果我这样做:
A.add "hello"
A.add "world"
我希望 A.list() 到 return 一些东西,因为字典是静态的,但它 return 是一个空列表。这是为什么?
澄清我正在尝试做的事情:我希望能够将类型 A 的对象注册到附加到类型本身的静态字典中,因为它会使对象存储库 'self contained' 在某种程度上。
您的 l
不是 字段 ,而是 属性 和 getter.
一个“属性”,与表象相反,它并不是一个具有某些价值的记忆单元。一个“属性”是一对get+set函数。只是功能,仅此而已。没有记忆细胞。
所以你自己做的是一个 属性 和一个 getter(没有 setter),而 getter 所做的就是创建一个新的 Dictionary
和 return 它。
这意味着,每次访问 A.l
时,您都会得到一本全新的词典。因为l
是函数,不是记忆单元。
现在,为了制作一个记忆单元(又名“字段”),通常会使用 static member val
,像这样:
static member val private l = Dictionary<string, A>()
不幸的是,在这种特殊情况下这不起作用,因为 F# 记录和联合上不允许使用静态字段。它们在实际 类 上运行良好,但在 F# 类型上运行不佳。
所以我建议将这些函数放在 模块中 而不是将它们设为静态方法:
type A = { S: string }
module A =
let private l = Dictionary<string, A>()
let add s = l.[s] <- { S=s }
let list () = l.Values
(总的来说:尝试使用更少的 类 和更多的模块和函数;它们在 F# 中更惯用,通常导致更少的问题)
现在这按预期工作了:
> A.add "hello";;
val it : unit = ()
> A.add "world";;
val it : unit = ()
> A.list();;
val it : Dictionary`2.ValueCollection<string,A> =
seq [{ S = "hello" }; { S = "world" }]
使用此类型:
type A =
{
S: string
}
static member private l = Dictionary<string, A>()
static member add s = A.l.[s] <- { S=s }
static member list () = l.Values
如果我这样做:
A.add "hello"
A.add "world"
我希望 A.list() 到 return 一些东西,因为字典是静态的,但它 return 是一个空列表。这是为什么?
澄清我正在尝试做的事情:我希望能够将类型 A 的对象注册到附加到类型本身的静态字典中,因为它会使对象存储库 'self contained' 在某种程度上。
您的 l
不是 字段 ,而是 属性 和 getter.
一个“属性”,与表象相反,它并不是一个具有某些价值的记忆单元。一个“属性”是一对get+set函数。只是功能,仅此而已。没有记忆细胞。
所以你自己做的是一个 属性 和一个 getter(没有 setter),而 getter 所做的就是创建一个新的 Dictionary
和 return 它。
这意味着,每次访问 A.l
时,您都会得到一本全新的词典。因为l
是函数,不是记忆单元。
现在,为了制作一个记忆单元(又名“字段”),通常会使用 static member val
,像这样:
static member val private l = Dictionary<string, A>()
不幸的是,在这种特殊情况下这不起作用,因为 F# 记录和联合上不允许使用静态字段。它们在实际 类 上运行良好,但在 F# 类型上运行不佳。
所以我建议将这些函数放在 模块中 而不是将它们设为静态方法:
type A = { S: string }
module A =
let private l = Dictionary<string, A>()
let add s = l.[s] <- { S=s }
let list () = l.Values
(总的来说:尝试使用更少的 类 和更多的模块和函数;它们在 F# 中更惯用,通常导致更少的问题)
现在这按预期工作了:
> A.add "hello";;
val it : unit = ()
> A.add "world";;
val it : unit = ()
> A.list();;
val it : Dictionary`2.ValueCollection<string,A> =
seq [{ S = "hello" }; { S = "world" }]