我有一个作为构造函数的过程,用来构造一个自定义的对象类型,一个“场景”对象。当我从另一个模块导入过程时,我会得到以下编译器错误:
main.nim(44,43)错误:类型不匹配: got (名称: string,seqSceneObject,slc: SceneLifeCycle),但期望其中之一: proc newScene(名称: string;sceneObjects: seqSceneObject;slc: SceneLifeCycle):场景
但是,当我将同一个过程的定义移到调用它的同一个文件上时,它就完美地工作了。我在导入方面做错了什么,还是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,它似乎无法通过导入newScene来工作:
# 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]
)但是,对于在newScene中定义的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]
)谢谢。
发布于 2018-02-06 07:46:34
简单回答:避免使用include。
很长的答案:问题在于,您将game_types包含到不同的模块中,因此,根据模块的不同,它们最终在不同的名称空间中声明,因此是不同的类型。例如,您的第一个示例调用newScene将main.SceneLyfeCycle传递给它,但是newScene接受scene_managment.SceneLyfeCycle。第二个示例工作正常,因为newScene接受main.SceneLyfeCycle,而您正是将它传递给它。
https://stackoverflow.com/questions/48637253
复制相似问题