【问题标题】:Convert Ptr () to SourceCompletionProvider将 Ptr() 转换为 SourceCompletionProvider
【发布时间】:2012-09-12 15:08:26
【问题描述】:

我已经部分解决了prev 的问题。

现在我可以通过bindings-gobject 注册GObject 子类型(参见hpase) 我可以使用c'g_type_add_interface_static 函数实现SourceCompletionProvider(但还没有尝试过)。

唯一的问题是将c'g_object_newv返回的Ptr ()转换为gtk2hs数据类型SourceCompletionProvider。我该怎么做?有什么提示吗?

SourceCompletionProvider 定义如下:

newtype SourceCompletionProvider = SourceCompletionProvider (ForeignPtr (SourceCompletionProvider))

这个定义是什么意思?为什么它是递归的?提供者是提供者的ForeignPtr——对我来说看起来很奇怪。

谢谢。

解决方案:

makeNewGObject mkGObject $ castPtr <$> c'g_object_newv myObType 0 nullPtr

【问题讨论】:

    标签: haskell gtk2hs


    【解决方案1】:

    外部SourceCompletionProvider 是必需的,因为这是一个新类型,而内部SourceCompletionProvider 只是一个标记,用于区分这个外部指针和指向其他类型的指针。如果您查看definition of Ptr a,它是data Ptr a = Ptr Addr# - a 是一种幻像类型,不会出现在右侧,因此定义实际上不是递归的。

    您可以使用newForeignPtr_Ptr () 转换为ForeignPtr (),然后使用castForeignPtr 将其转换为ForeignPtr SourceCompletionProvider

    编辑: 再看一遍之后,我认为要完成这项工作,您需要先使用上述方法将Ptr 转换为GObject,然后使用unsafeCastGObject。不过没有测试。

    【讨论】:

    • 嗯...我想我需要添加终结器,对吧?我可以使用p'g_object_unref 作为终结器,够了吗?
    • 从我看到C interface documentation 后的情况来看,你是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2010-12-02
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多