我试图在我的应用中实现一个设置模块,该模块应该包含有关当前应用状态的信息。例如,如果用户打开某个文件,我需要存储文件名。因为我还在学习F#,所以我希望尽可能地做到这一点。
我知道每次更改内容时都应该创建一个新值,但是我应该在哪里存储这个值?它应该是一个单身人士,因为它是不可改变的,我努力解决。
我如何实现这样的"全局变量"?它在功能方法中是否表现良好?
答案 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"