proc调用返回类型的类型不匹配错误来自导入,但不包括时



我有一个我用作构造函数的过程,用于构造自定义对象类型,即"场景"对象。当我从另一个模块导入该过程时,我会收到此编译器错误:

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包括在不同的模块中,因此取决于它们最终以不同命名空间声明的模块,因此是不同的类型。例如,您的第一个示例调用newScenemain.SceneLyfeCycle传递给它,但是newScene接受scene_managment.SceneLyfeCycle。您的第二个示例有效,因为newScene接受main.SceneLyfeCycle,并且您将其完全传递给它。

最新更新