如何实现应用程序范围的变量

时间:2014-11-10 13:23:03

标签: f#

我试图在我的应用中实现一个设置模块,该模块应该包含有关当前应用状态的信息。例如,如果用户打开某个文件,我需要存储文件名。因为我还在学习F#,所以我希望尽可能地做到这一点。

我知道每次更改内容时都应该创建一个新值,但是我应该在哪里存储这个值?它应该是一个单身人士,因为它是不可改变的,我努力解决。

我如何实现这样的"全局变量"?它在功能方法中是否表现良好?

2 个答案:

答案 0 :(得分:2)

这与函数中的函数一样,let mutable(在模块中使用):

let mutable a = 4
a      // gets a
a <- 6 // sets a

或者,您可以使用可变对象作为静态成员(此示例使用可变引用单元格):

type Settings =
    static member Filename = ref ""

Settings.Filename := "OpenMe.txt"

有时可能需要全局变量,这可能是一个可行的用例,但它们被认为是危险的。改变并影响程序的大部分的值可能会使事情变得不可预测。

那就是说,在像你这样的情况下,单个全局变量可能是一个很好的解决方案。它可以保存个人设置的记录。我要注意,任何改变全局变量的操作只有在程序处于明确定义的状态时(即不在复杂操作的中间)才会发生,并保证变量的新值是合理的

示例:

type StateVariables =
    { Filename : string
      Opened : int }

module State =
    let mutable private cur = { Filename = ""; Opened = 0 }
    let get () = cur

    let openFile name =
        // ...
        cur <- { cur with Filename = name; Opened = cur.Opened + 1 }

答案 1 :(得分:0)

您可以在模块中存储全局变量:

module Settings =
    let mutable FileName = ""

open Settings

FileName <- "foo"