2016-04-29 14 views
7

Mam strategie wyrażone jako leków generycznych w NIM:jaka jest definicja typu NU dla ogólnej procedury?

proc fooStrategy[T](t: T, ...) 
proc barStrategy[T](t: T, ...) 

Chciałbym utworzyć tabelę przeglądową dla strategii wg nazwy ... więc próbowałem:

type 
    Strategy*[T] = proc[T](t: T, ...) 

let strategies* = toTable[string, Strategy[T]]([ 
    ("foo", fooStrategy), ("bar", barStrategy)]) 

To nie robi praca - deklaracja typu nie powiedzie się. Gdybym doszedł do tego, mogłem się domyślić, że tabela strategii również miałaby problemy. Czy jest inny sposób na zrobienie tego? "T" ma być "typem kolekcji 1D" - może to być sekwencja, tablica, wektor z blasów itp. Mogłabym dodać konkretne strategie do tabeli dla wspólnych kolekcji, ale nadal mam problem ze wskaźnikiem funkcji, jako

type 
    Strategy* = proc(t: any, ...) 

let strategies* = toTable[string, Strategy]([ 
    ("foo-seq[int]", fooStrategy[int]), ...]) 

nadal ma problemy. Jakieś sugestie?

Odpowiedz

4

Istnieje wiele problemów z kodem:

Po pierwsze, initTable nie bierze listę przedmiotów na stole. Ma tylko początkowy rozmiar. Zamiast tego chcesz użyć toTable.

Po drugie, należy jawnie ustawić wartość dla parametru ogólnego T podczas tworzenia tabeli, ponieważ w czasie wykonywania wszystkie parametry ogólne muszą być powiązane z typem.

Po trzecie, typy proc muszą dokładnie pasować, w tym pragmy na proc. Ten jest trudny.

Oto przykład roboczych:

import tables 

type 
    Strategy*[T] = proc(t: T) {.gcsafe, locks: 0.} 

proc fooStrategy[T](t: T) = echo "foo" 
proc barStrategy[T](t: T) = echo "bar" 

let strategies* = toTable[string, Strategy[int]]([ 
    ("foo", fooStrategy[int]), ("bar", barStrategy[int]) 
]) 

W tym przykładzie, tworzę tabelę z Strategy[int] wartości (nie można mieć tabelę z wartościami Strategy[T] jak nie jest to rodzaj betonu). Wykonuję instancję fooStrategy i barStrategy z [int], aby dopasować typ tabeli. Dodałem {.gcsafe, locks: 0.} do definicji typu. Jeśli to jest pominięte, otrzymasz błąd kompilatora:

test.nim(9, 49) Error: type mismatch: got (Array constructor[0..1, (string, proc (t: int){.gcsafe, locks: 0.})]) 
but expected one of: 
proc (pairs: openarray[(string, Strategy[system.int])]): Table[system.string, Strategy[system.int]]{.gcsafe, locks: 0.} 

Jak widać, kompilator mówi, w pierwszej linii, co widzi i w trzeciej linii, czego oczekuje. widzi proc s z {.gcsafe, locks: 0.}, ponieważ te pragmy są niejawnie przypisane do zdefiniowanego powyżej proc. Pragmy zmieniają typ, więc aby móc je przypisać, należy je zdefiniować na Strategy[T].

+0

'initTable' ->' toTable' right ... poprawiony w pytaniu, ponieważ nie to, co próbowałem dostać. :)... dzięki! – shaunc

+1

Również [{.nimcall.}] (Http://nim-lang.org/docs/manual.html#types-procedural-type) również wykonuje sztuczkę https://glot.io/snippets/ee8rmk9fs0 – Arrrrrrr

Powiązane problemy