我应该在Crystal中传递给以下方法什么?

问题描述

背景

我正在尝试使用some Cairo bindings for Crystal,但是在语法以及如何调用下面的方法方面遇到了麻烦。 它是这样实现的:

# Inside Module Cairo,class Surface

# ...

def write_to_png_stream(write_func : LibCairo::WriteFuncT,closure : Void*) : Status
   Status.new(LibCairo.surface_write_to_png_stream(@surface,write_func,closure).value)
end
# Inside Module LibCairo

# ...

enum StatusT
  SUCCESS = 0

  NO_MEMORY
  INVALID_RESTORE
  # ...
end

# ...

alias WriteFuncT = Void*,UInt8*,UInt32 -> StatusT

# ...

fun surface_write_to_png_stream = cairo_surface_write_to_png_stream(
  surface : PSurfaceT,write_func : WriteFuncT,closure : Void*
) : StatusT

问题

具体来说,我在问如何调用Cairo :: Surface#write_to_png_stream方法。我作为write_func:LibCairo::WriteFuncT会通过什么?我作为closure: Void*会通过什么?

我尝试了以下操作,但是我没有设法使其正常工作...

def my_write_func(a : Void*,b : UInt8*,c : UInt32) : Cairo::C::LibCairo::StatusT
   puts a
   puts b
   puts c

   Cairo::C::LibCairo::StatusT::SUCCESS
end

surface = Cairo::Surface.new Cairo::Format::ARGB32,400,300
ctx = Cairo::Context.new surface

ctx.set_source_rgba 1.0,0.0,1.0,1.0
ctx.rectangle 0.0,400.0,300.0
ctx.fill

# here,how do I call surface.write_to_png_stream passing my 'my_write_func'?
# a Proc doesn't seem to work.. ( ->my_write_func(Void*,UInt32) )

surface.finish

解决方法

最后我让它工作了。或者,至少我设法称呼它。

surface.write_to_png_stream ->my_write_func(Void*,UInt8*,UInt32),Pointer(Void).null

事实证明,正如我所怀疑的,这毕竟是一个Proc,我也只需要一个空指针。 为了将来参考,我有issue at the repo讨论了此方法的具体用法,但我想在此处可以对语法/语义问题进行解答。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...