pbl*_*cci 7 .net implementation f# byref out-parameters
所以,给出以下代码
type MyClass () =
let items = Dictionary<string,int>()
do
items.Add ("one",1)
items.Add ("two",2)
items.Add ("three",3)
member this.TryGetValue (key,value) =
items.TrygetValue (key,value)
let c = MyClass ()
let d = Dictionary<string,int> ()
d.Add ("one",1)
d.Add ("two",2)
d.Add ("three",3)
Run Code Online (Sandbox Code Playgroud)
以及以下测试代码
let r1,v1 = d.TryGetValue "one"
let r2,v2 = c.TryGetValue "one"
Run Code Online (Sandbox Code Playgroud)
r1,v1行正常工作.r2,v2线炸弹; 抱怨c.TryGetValue必须给出一个元组.有趣的是,在每行中,TryGetValue的签名是不同的.如何让我的自定义实现显示与BCL版本相同的行为?或者,问另一种方式,因为F#有(隐含的)的元组参数,令行禁止参数和BCL参数的概念,我知道如何咖喱和元组风格的区分,我怎么能强迫第三样式(一拉BCL方法)?
如果不清楚,请告诉我.
TryGetValue有一个out参数,所以你需要在F#中做同样的事情(通过byref标记OutAttribute):
open System.Runtime.InteropServices
type MyDict<'K,'V when 'K : equality>() = // '
let d = new System.Collections.Generic.Dictionary<'K,'V>()
member this.TryGetValue(k : 'K, [<Out>] v: byref<'V>) =
let ok, r = d.TryGetValue(k)
if ok then
v <- r
ok
let d = new MyDict<string,int>()
let ok, i = d.TryGetValue("hi")
let mutable j = 0
let ok2 = d.TryGetValue("hi", &j)
Run Code Online (Sandbox Code Playgroud)
F#自动允许您将后缀输出参数转换为返回值,因此您只需要创建以out参数结尾的方法.
| 归档时间: |
|
| 查看次数: |
1655 次 |
| 最近记录: |