在 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#dynamic size
中b
,它在分配时由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
类型,这只是允许您在没有真正拥有的情况下表达未初始化概念的漏洞),这就是为什么您必须为数组中的元素。