gpt4 book ai didi

f# - 为什么结构值必须是可变的才能设置索引属性?

转载 作者:行者123 更新时间:2023-12-04 12:57:48 24 4
gpt4 key购买 nike

考虑以下程序:

[<Struct>]
type Grid2D<'T> =
val RowLength : int
val Data : 'T[]
new(rowLength, data) = { RowLength = rowLength; Data = data }

member this.Item
with get(rowIndex, columnIndex) =
this.Data.[rowIndex * this.RowLength + columnIndex]
and set(rowIndex, columnIndex) value =
this.Data.[rowIndex * this.RowLength + columnIndex] <- value

let g = Grid2D(3, Array.zeroCreate(3 * 3))
g.[1, 1] <- 4

最后一行无法编译:

error FS0256: A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...'



但是,如果 [<Struct>]属性被删除,因此 Grid2D 是一个引用类型,然后程序编译。

有趣的是,手动内联属性 setter 也可以很好地编译:
g.Data.[1 * g.RowLength + 1] <- 4

那么为什么称它为编译错误呢?

注意:我知道此编译器错误的存在使得无法通过设置其字段之一来改变结构的非可变值。但我显然没有在这里改变结构。

最佳答案

我将在这里猜测它适用的错误消息的第二部分 - “或采用值类型的地址”。它不是可变性,而是 地址 需要采用的值类型,以便您在更改数据时引用相同的值 g。

关于f# - 为什么结构值必须是可变的才能设置索引属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31216924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com