【问题标题】:C++-like static variables inside a F# functionF# 函数中的类 C++ 静态变量
【发布时间】:2014-10-07 09:49:12
【问题描述】:

在 F# 中有一些类似的东西吗?类似的东西

let f () =
   let mutable static a = 0
   ...

?

【问题讨论】:

  • 您需要从函数外部访问此变量吗?它的“静态”修饰符有什么用?
  • @Petr No. 没有外部访问权限。我知道这不是“功能方式”。一个函数应该只被调用一次,这就是我感兴趣的原因。

标签: f# closures mutable ref


【解决方案1】:

如果您将let f () = ... 脱糖为let f = fun () -> ...,则可以将a 的声明放在f 的定义内,但要放在函数的开头。这将使函数关闭a,同时保持a 本地到f。这样做的问题是您可能不会关闭可变变量,因此您需要使用 ref:

let f =
    let a = ref 0
    fun () ->
        ....

【讨论】:

    【解决方案2】:

    最简单的类比就是把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 不可见

    【讨论】:

    • 比 sepp2k 的变体稍微复杂一点。谢谢你的帮助。
    猜你喜欢
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2015-06-20
    • 2011-06-29
    • 2011-07-08
    相关资源
    最近更新 更多