为什么我在一个模块中定义的字典不允许被第二个模块变异?

时间:2015-07-16 19:18:24

标签: .net f#

我通过let mutable在我的第一个模块中定义了一个空的可变字典。在后续模块(知道第一个模块)中,我尝试将一个键值对添加到字典中,但此代码从不运行(但编译成功)。为什么呢?

另一方面,字典似乎可以在 的模块中成功变异。

CODE

File1.fs

module File1
let mutable dictionary = System.Collections.Generic.Dictionary<string, int>()

File2.fs

module File2
File1.dictionary.Add("one",1)

Program.fs

[<EntryPoint>]
let main argv = 
printfn "%A" File1.dictionary.["one"]
0 // return an integer exit code

收到错误:

  

mscorlib.dll中出现未处理的“System.Collections.Generic.KeyNotFoundException”类型的异常附加信息:字典中没有给定的键。

1 个答案:

答案 0 :(得分:5)

您没有任何调用 import numpy as np dataMatrix = np.empty([4,1]) def collectData(): receive data from hardware in the form of a 4x1 list while receivingData: newData = collectData() dataMatrix = np.r_(dataMatrix, newData) 中代码的内容。正确的方法是在函数内,所以

File2.fs

File2

Program.fs

module File2
let addOne() = File1.dictionary.Add("one", 1)

也就是说,F#中通常避免全局可变状态;拥有let main _ = File2.addOne() printfn.... ,然后将其作为参数传递给File1.createDict(),而不是将其存储为全局变量,这更具惯用性。

旁注你实际上并不需要File2.addOne标记,因为这意味着字典引用本身是可变的,而不仅仅是它的内容(mutable的定义总是可变的)。