为什么这不是 byref 的有效用法?
Why is this not a valid usage of byref?
let iter2D (map: 'T byref -> unit) (arr: 'T[][]) =
for y = 0 to arr.Length - 1 do
let row = arr.[y]
for x = 0 to row.Length - 1 do
let mutable elem = arr.[y].[x]
map &elem
最后一行有:"The address of the variable 'elem' cannot be used at this point."怎么了?
在 F# 中,'T byref
显示为常规类型,但实际上并非如此 - 它对应于 C# 中的 ref
和 out
参数,它们是方法参数。这就是 'T byref
在 F# 中有点奇怪的原因。
我认为您将无法通过普通的 F# 函数使用它,因为函数 T1 -> T2
使用方法 T2 Invoke(T1 arg)
编译为 FSharpFunc<T1, T2>
- 您无法通过byref
类型到泛型(因为它不是真正的类型)。
解决方法是定义您自己的具有 byref
类型的委托:
type FastAction<'T> = delegate of 'T byref -> unit
有了这个,你可以写 iter2D
直接遍历数组:
let iter2D (map:FastAction<'T>) (arr: 'T[][]) =
for y = 0 to arr.Length - 1 do
let row = arr.[y]
for x = 0 to row.Length - 1 do
map.Invoke(&arr.[y].[x])
下面将改变数组中的值:
let arr = [| [| 0 |] |]
iter2D (FastAction(fun a -> a <- 10)) arr
let iter2D (map: 'T byref -> unit) (arr: 'T[][]) =
for y = 0 to arr.Length - 1 do
let row = arr.[y]
for x = 0 to row.Length - 1 do
let mutable elem = arr.[y].[x]
map &elem
最后一行有:"The address of the variable 'elem' cannot be used at this point."怎么了?
在 F# 中,'T byref
显示为常规类型,但实际上并非如此 - 它对应于 C# 中的 ref
和 out
参数,它们是方法参数。这就是 'T byref
在 F# 中有点奇怪的原因。
我认为您将无法通过普通的 F# 函数使用它,因为函数 T1 -> T2
使用方法 T2 Invoke(T1 arg)
编译为 FSharpFunc<T1, T2>
- 您无法通过byref
类型到泛型(因为它不是真正的类型)。
解决方法是定义您自己的具有 byref
类型的委托:
type FastAction<'T> = delegate of 'T byref -> unit
有了这个,你可以写 iter2D
直接遍历数组:
let iter2D (map:FastAction<'T>) (arr: 'T[][]) =
for y = 0 to arr.Length - 1 do
let row = arr.[y]
for x = 0 to row.Length - 1 do
map.Invoke(&arr.[y].[x])
下面将改变数组中的值:
let arr = [| [| 0 |] |]
iter2D (FastAction(fun a -> a <- 10)) arr