【发布时间】:2014-10-07 09:49:12
【问题描述】:
在 F# 中有一些类似的东西吗?类似的东西
let f () =
let mutable static a = 0
...
?
【问题讨论】:
-
您需要从函数外部访问此变量吗?它的“静态”修饰符有什么用?
-
@Petr No. 没有外部访问权限。我知道这不是“功能方式”。一个函数应该只被调用一次,这就是我感兴趣的原因。
在 F# 中有一些类似的东西吗?类似的东西
let f () =
let mutable static a = 0
...
?
【问题讨论】:
如果您将let f () = ... 脱糖为let f = fun () -> ...,则可以将a 的声明放在f 的定义内,但要放在函数的开头。这将使函数关闭a,同时保持a 本地到f。这样做的问题是您可能不会关闭可变变量,因此您需要使用 ref:
let f =
let a = ref 0
fun () ->
....
【讨论】:
最简单的类比就是把let放在函数之前:
let mutable static a = 0
let f () =
如果你真的想隐藏这个变量,你可以将整个东西封装在一个父模块中。
否则,序列表达式允许记住函数中的变量,但这是一个非常重要的变化。
其他一些想法 - 隐藏在一个类中:
type t() =
static let mutable t = 1
static member f() = 1
或一个模块
module t =
let mutable private t = 1
let f() = 1
在模块方法中,f 可见,而 t 不可见
【讨论】: