我读到有关处理数组时我们应该使用myArray.[i]
,但是,根据我的经验myArray[i]
编译。
但是,当我想写入.Net中的数组(因此它是可变的)时,会出现错误let myArray.[i] = 3
,但let myArray[i] =3
有效。
处理此类事情的最佳做法是什么?
另外,我应该使用Array.get
还是使用.[]
?
如何将值设置为锯齿状数组,例如let myArray.[i].[j] = 5
答案 0 :(得分:5)
1)如果要为数组单元格指定值,请使用赋值运算符<-
:
myArray.[i] <- 3
2)let myArray[i] = 3
编译,因为编译器将其理解为myArray
函数,并以列表作为参数并返回3
。如果您阅读了警告和类型签名,您会发现自己做错了。
3)Array.get
是a single call to .[]
。在某些情况下,Array.get
对于函数组合和避免类型注释很方便。例如,你有
let mapFirst arrs = Array.map (fun arr -> Array.get arr 0) arrs
VS
let mapFirst arrs = Array.map (fun (arr: _ []) -> arr.[0]) arrs
答案 1 :(得分:4)
您的方法都不正确。假设你有一些像
这样的定义let myArray = [| 1; 7; 15 |]
let i = 2
你真正想要的是这样的:
myArray.[i] <- 3
写作时
let myArray[i] = 3
你实际上是在定义一个函数 myArray,它接受一个整数列表并返回一个整数。这根本不是你想要的。
答案 2 :(得分:2)
这里的问题是你试图在let表达式中嵌入一个数组赋值。表达式let myArray[3] = 2
不是对数组的赋值。相反,它是一个功能定义。看看fsi中发生了什么:
let myArray[i] = 3;;
val myArray : int list -> int
(那里实际上也有警告)。以不同方式对其进行格式化也会发现这一事实:let myArray [3] = 2
。
正如其他人指出的那样,.[]
用于数组访问,并且要分配给数组,您使用myArray.[i] <- 3
(在let表达式中 not )。< / p>