gpt4 book ai didi

.net - 如何实现与 Dictionary.TryGetValue 相同的行为

转载 作者:行者123 更新时间:2023-12-04 10:45:18 25 4
gpt4 key购买 nike

所以,给定下面的代码

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)

以及下面的测试代码
let r1,v1 = d.TryGetValue "one"
let r2,v2 = c.TryGetValue "one"

r1,v1 行工作正常。 r2,v2 线炸弹;提示 c.TryGetValue 必须被赋予一个元组。有趣的是,在每一行中,TryGetValue 的签名都是不同的。如何让我的自定义实现表现出与 BCL 版本相同的行为?或者,换一种方式问,既然F#(隐含)有元组参数、柯里化(Currying)参数和BCL参数的概念,而且我知道如何区分柯里化(Currying)和元组样式,我该如何强制第三种样式(a la 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)

F# 自动允许您将后缀输出参数转换为返回值,因此您只需编写一个以输出参数结尾的方法。

关于.net - 如何实现与 Dictionary.TryGetValue 相同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2725489/

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