繁体   English   中英

在F#中创建一个动态大小的字节数组

[英]Create a byte array with dynamic size in F#

在C#和Java中,可以像这样创建一个字节数组

byte[] b = new byte[x];

其中x表示数组的大小。 我想做的是在F#中做同样的事情。 我已经搜索了如何操作并在文档中查找它。 我认为我可能使用了错误的搜索词,因为我无法找到方法。

到目前为止我发现的是Array.create可以像这样使用:

let b = Array.create x ( new Byte() )

还有另一种方法可以做到这一点,它更类似于在C#和Java中完成的方式吗?

最接近的F#模拟是Array.zeroCreate:

let b: byte [] = Array.zeroCreate x

在Java和C#平台上,F#不是将隐式数组元素初始化为0字节,而是使数组元素的初始值明显。

至于F#中b dynamic size ,它在分配时由x值定义一次,以后不能通过改变x来改变,类似于C#/ Java。

let b = Array.create<byte> x 0uy  //Array.zeroCreate<byte> x

我想你想要创建一个未初始化的数组并在以后填充它:

let arr = Array.zeroCreate 10
for i in 0..9 do
   arr.[i] <- byte(i*i)

这是你通常用C#/ Java做的方式,这在F#中是单一的。 想一想; 如果你忘记初始化一些元素,你必须处理null噩梦。

几乎在所有情况下,您始终可以通过Array模块或数组理解中的高阶函数替换上述过程:

let arr = Array.init 10 (fun i -> byte(i*i))

要么

let arr = [| for i in 0..9 do -> byte(i*i)|]

看看这个MSDN页面 ; 它包含有关在F#中使用Array的有用信息。

你什么意思?

F#的语法与C#Java不同,您使用Array模块让他创建一个带有初始化程序的数组。 没有什么奇怪的,一种语言是功能性的,而另一种语言是必要的,因此确实需要这些差异。

根据F#语言规范,您无法声明未初始化的内容(除非使用特定模式作为Option类型,这些模式只是允许您在没有真正拥有它的情况下表达未初始化概念的漏洞),这就是您必须传递初始化程序的原因对于数组中的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM