嘿嘿,
在通過一些泛型進行編碼時,我偶然發現了我的一個泛型函式的問題。我有2種這樣的
import std/options
import norm
type
A = ref object of Model
name: string
B = ref object of Model
name: string
myA: Option[A]
norm是 sqlite 的 nim 中的 ORM,我只需擁有從 Model 繼承的型別并呼叫table()它,就可以在編譯時獲取模型所屬的 sql-tablename。
由于各種原因,我希望能夠找出給定模型鏈接到的所有表的名稱。在這種情況下,B鏈接到 type A,但我需要在編譯時呼叫以獲取該表名(如果正在使用 pragma A.table(),這可能是任何東西)。{.tableName.}
但是,我似乎找不到訪問我的型別的方法,因為我無法在編譯時呼叫模塊的典型get()方法。options我的出路是什么?
uj5u.com熱心網友回復:
感謝 nim-discord 服務器上非常樂于助人的人(在那里大聲疾呼),我能夠解決這個問題。事實上,我只是提出了這個問題,所以我自己可以更輕松地用谷歌搜索答案。
您可以使用該[typetraits][1]庫及其genericParams函式。
genericParams(B).get(0)
使用 genericParams 作為工具,您可以做一些有趣的事情,比如在編譯時迭代一個型別的所有欄位(不是實體!),檢查給定欄位是否是模型的選項并比較表名
proc getRelatedFieldName[M: Model, O:Model](targetType: typedesc[O], sourceType: typedesc[M]): Option[string] =
let source = sourceType()
for sourceFieldName, sourceFieldValue in source[].fieldPairs:
when sourceFieldValue is Option:
when sourceFieldValue.get() is Model:
when O.table() == genericParams(sourceFieldValue.type()).get(0).table():
return some(sourceFieldName)
return none(string)
echo A.getRelatedFieldName(B) # returns "some('myA')"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/410128.html
標籤:
下一篇:如何正確地將蒙版插入原始影像?
