Как я могу реализовать то же поведение как Словарь. TryGetValue

Так, учитывая затем после кода

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# имеет (неявно) понятие параметров кортежа, приправленных карри параметров и параметров BCL, и я знаю, как различать с приправой карри и стиль кортежа, как я могу вызвать третий стиль (а-ля методы BCL)?

Сообщите мне, неясно ли это.

7
задан Brian 27 April 2010 в 22:12
поделиться

1 ответ

TryGetValue имеет выходной параметр, поэтому вам нужно сделать то же самое в 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 # автоматически разрешает вы превращаете параметры суффикса в возвращаемые значения, поэтому вам просто нужно создать метод, который заканчивается параметром вывода.

8
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: