我有一个我用作构造函数的过程,用于构造自定义对象类型,即"场景"对象。当我从另一个模块导入该过程时,我会收到此编译器错误:
main.nim(44,43(错误:类型不匹配:got(name:string,seq [sceneObject],slc:seneelifecycle( 但期望之一: Proc Newscene(名称:字符串; sceneObjects:seq [sceneObject]; slc:seacelifecycle(:场景
但是,当我将同一过程的定义移至我从中呼叫的同一文件时,它可以很好地工作。我在导入方面做错了什么,或者NIM的导入和导出行为与自定义对象类型存在不一致之处?另外,只需包含文件解决此问题即可。
# src/game_types.nim - where I am storing type definitions
SceneLifeCycleProc* = proc()
SceneObject* = ref object
tags*: seq[string]
active*: bool
visible*: bool
x, y: float
Scene* = ref object
name*: string
sceneObjects*: seq[SceneObject]
onRegister*: SceneLifeCycleProc
onEnter*: SceneLifeCycleProc
onUpdate*: SceneLifeCycleProc
onRender*: SceneLifeCycleProc
onExit*: SceneLifeCycleProc
onDestroy*: SceneLifeCycleProc
# src/scene_managment.nim - file exporting newScene from
include game_types
proc newScene* ( name: string, sceneObjects: seq[SceneObject], slc:
SceneLifeCycle): Scene =
new result
result.name = name
result.sceneObjects = sceneObjects
result.onRegister = slc[0]
result.onEnter = slc[1]
result.onUpdate = slc[2]
result.onRender = slc[3]
result.onExit = slc[4]
result.onDestroy = slc[5]
和main.nim,这似乎通过进口新闻习惯而起作用:
# src/main.nim
include game_types
import scene_management
# throws type mismatch error
let titleScene = newScene(
"title",
newSeq[SceneObject](4),
[registerTitleScene.SceneLifeCycleProc,
enterTitleScene.SceneLifeCycleProc,
updateTitleScene.SceneLifeCycleProc,
renderTitleScene.SceneLifeCycleProc,
exitTitleScene.SceneLifeCycleProc,
destroyTitleScene.SceneLifeCycleProc]
)
但是,随着新闻定义程序在main.nim中定义的过程,它的工作原理很棒:
# src/main.nim - this works, and I don't know why importing doesn't:
include game_types
# defined in the same file
proc newScene ( name: string, sceneObjects: seq[SceneObject], slc:
SceneLifeCycle): Scene =
new result
result.name = name
result.sceneObjects = sceneObjects
result.onRegister = slc[0]
result.onEnter = slc[1]
result.onUpdate = slc[2]
result.onRender = slc[3]
result.onExit = slc[4]
result.onDestroy = slc[5]
# no compiler error
let titleScene = newScene(
"title",
newSeq[SceneObject](4),
[registerTitleScene.SceneLifeCycleProc,
enterTitleScene.SceneLifeCycleProc,
updateTitleScene.SceneLifeCycleProc,
renderTitleScene.SceneLifeCycleProc,
exitTitleScene.SceneLifeCycleProc,
destroyTitleScene.SceneLifeCycleProc]
)
谢谢。
简短答案:避免使用include
。
长答案:问题在于,您将game_types
包括在不同的模块中,因此取决于它们最终以不同命名空间声明的模块,因此是不同的类型。例如,您的第一个示例调用newScene
将main.SceneLyfeCycle
传递给它,但是newScene
接受scene_managment.SceneLyfeCycle
。您的第二个示例有效,因为newScene
接受main.SceneLyfeCycle
,并且您将其完全传递给它。