如何在编译时实例化Nim的DateTime对象以支持默认初始化?
解决Nim 2中DateTime对象字段默认初始化的问题
由于Nim的对象字段默认值要求是编译期可求值的表达式,而times.now()是运行时函数,无法用于默认值。你只需要一个合法的DateTime占位实例,后续由其他包覆盖,因此可以用编译时可构造的固定值来实现:
解决方案:使用编译时可构造的固定DateTime值
利用initDateTime传入编译时常量参数,构造一个合法的DateTime实例作为默认值,比如Unix纪元时间(1970-01-01 00:00:00 UTC):
import std/times type A = object d: DateTime = initDateTime(1970, 1, 1, 0, 0, 0, utc()) # 现在可以正常默认初始化对象 let x = default(A)
原理说明
当initDateTime的所有参数都是编译时常量时,Nim编译器会在编译期直接计算出对应的DateTime实例,完全满足默认值的编译期求值要求。这个占位值只是临时用,后续norm从数据库解析数据时会自动覆盖该字段,完全符合你的需求。
如果需要其他固定的占位时间,只要传入的年、月、日等参数是编译时常量即可,比如initDateTime(2000, 1, 1, 0, 0, 0, utc())也可以正常工作。
内容的提问来源于stack exchange,提问作者Philipp Doerner
相关产品推荐
相关产品推荐

