在C#和Java中,可以像这样创建一个字节数组
byte[] b = new byte[x];
其中x
表示数组的大小。我想做的是在F#中做同样的事情。我已经搜索了如何操作并在文档中查找它。我认为我可能使用了错误的搜索词,因为我无法找到它。
到目前为止,我发现Array.create
可以像这样使用:
let b = Array.create x ( new Byte() )
还有其他方法可以做到这一点,它更类似于在C#和Java中完成的方式吗?
答案 0 :(得分:10)
最接近的F#模拟将是Array.zeroCreate:
let b: byte [] = Array.zeroCreate x
而不是隐式数组元素在Java和C#平台上初始化为0
字节F#使数组元素的初始值明显。
对于F#中dynamic size
的{{1}},它在分配时由b
值定义一次,以后通过更改x
无法更改,类似于C#/ Java ,
答案 1 :(得分:8)
let b = Array.create<byte> x 0uy //Array.zeroCreate<byte> x
答案 2 :(得分:6)
我想你想要创建一个未初始化的数组并在以后填充它:
let arr = Array.zeroCreate 10
for i in 0..9 do
arr.[i] <- byte(i*i)
这是你通常用C#/ Java做的方式,这在F#中是单一的。想一想;如果你忘了初始化一些元素,你必须处理null
噩梦。
在几乎所有情况下,您始终可以通过Array module或数组理解中的高阶函数替换上述过程:
let arr = Array.init 10 (fun i -> byte(i*i))
或
let arr = [| for i in 0..9 do -> byte(i*i)|]
看看this MSDN page;它包含有关在F#中使用Array的有用信息。
答案 3 :(得分:-1)
你是什么意思?
F#的语法与 C#和 Java 不同,您正在使用Array
模块让他创建一个数组使用初始化程序。没有什么奇怪的,一种语言是功能性的,而另一种语言是必要的,因此确实需要这些差异。
根据 F#语言规范,您无法声明未初始化的内容(除非使用特定模式作为Option
类型,这些模式只是可以表达未初始化概念的漏洞利用没有真正拥有它,这就是为什么你必须为数组中的元素传递初始化器。