F#初始化2D字符串数组

时间:2015-09-18 00:55:08

标签: f#

所以,我有一个简单的结构,只包含一个多维的字符串数组,看起来像这样

type Structure = 
     struct
      val mutable SubText: string[][]
     end 

在另一个函数中,我们有类似的东西:

let mutable Struct : Structure = new Structure()

let stringArray = [| "string1"; "string2"; "string3" |]
Struct.SubText.[0] <- stringArray

但是只要程序到达这个部分,我们就会得到一个NullReferenceException

我想知道如何解决这个问题,谢谢。 我确实看到了另一个问题几乎相同的问题,但这与2d int数组有关,而不是字符串

2 个答案:

答案 0 :(得分:2)

您正在尝试设置外部数组的第一项,但此时您的数组数组仍为null;因此例外。

我真的不明白你在哪里使用所有可变的数组和数组,所以只需要一个快速的解决方法来修复代码:

let mutable Struct = Structure ()

let stringArray = [| "string1"; "string2"; "string3" |]
Struct.SubText <- [| stringArray |]

我只是将整个外部数组设置为包含您的数组的数组,您也可以执行两步过程,例如

let mutable Struct = Structure ()

let stringArray = [| "string1"; "string2"; "string3" |]
Struct.SubText <- Array.zeroCreate 5
// now SubText.[0] exists
Struct.SubText.[0] <- stringArray

// > Struct.SubText;;
// val it : string [] [] = [|[|"string1"; "string2"; "string3"|]; null; null; null; null|]

答案 1 :(得分:1)

Struct的实例由默认的无参数struct构造函数构造时,表示SubText的jugged数组的结构字段string保持未初始化,因此索引器Struct.SubText.[0]被应用于null值,这就是抛出异常的原因。

您可以通过向默认的no-arg struct构造函数添加一些在实例构造时初始化SubText的额外显式构造函数来轻松解决此问题:

type Structure = 
    struct
        val mutable SubText: string[][]
    end
    new(size) = {SubText = Array.zeroCreate size} // to array of given number of string arrays
    new(_) = {SubText = [|[||]|]} // to array of single empty string array

现在您可以使用如下所示的构造函数,在实例构造时初始化字段SubText并且可以使用索引器:

let Struct = new Structure(2) // or just let Struct = new Structure(())
let stringArray = [| "string1"; "string2"; "string3" |]
Struct.SubText.[0] <- stringArray
//Checking out in FSI:
//>Struct.SubText.[0];;
//val it : string [] = [|"string1"; "string2"; "string3"|]

SubText被选为mutable时,它可以随时更改为任意数量子阵列的另一个jugged数组,不一定是初始size