为什么这不是byref的有效用法?

时间:2016-04-11 00:17:38

标签: f# byref

self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)

最后一行有:“此时不能使用变量'elem'的地址。”怎么了?

1 个答案:

答案 0 :(得分:6)

在F#'T byref中显示为常规类型,但在封面下,它不是 - 它对应于C#中的refout参数,这些是方法参数的特殊注释。这就是为什么'T byref在F#中有点奇怪。

我认为你无法通过普通的F#函数使用它,因为函数T1 -> T2被编译为FSharpFunc<T1, T2>并使用方法T2 Invoke(T1 arg) - 你无法通过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