使用 Gtk2Hs,我曾经能够将 gtk 对象与 ==
进行比较,以了解它们是否相同。例如:
boxIsFromState :: VBox -> State -> Bool
boxIsFromState widget state = _widget state == widget
其中State
是另一个VBox的自定义数据类型容器。
我注意到 haskell-gi
的小部件不是从 Eq
派生的。那么还有其他方法来比较对象吗?
最佳答案
免责声明:虽然我是 Haskell 专家,但我对 haskell-gi 具体了解甚少。也就是说...
查看文档,我们有:
newtype Widget = Widget (ManagedPtr Widget)
data ManagedPtr a = ManagedPtr {
managedForeignPtr :: ForeignPtr a
, managedPtrIsOwned :: IORef Bool
}
导出所有适当的构造函数,并且 ForeignPtr
和 IORef
都提供 Eq
实例。因此,编写我们自己的 Eq
实例应该很简单——如此简单,编译器本身应该能够做到这一点。
{-# LANGUAGE StandaloneDeriving #-}
deriving instance Eq (ManagedPtr a)
deriving instance Eq Widget
我并不是 100% 清楚这是否具有正确的语义;出于平等测试的目的,您可能希望忽略所有权,在这种情况下您可能需要编写
instance Eq (ManagedPtr a) where
(==) ManagedPtr { managedForeignPtr = p }
ManagedPtr { managedForeignPtr = p' }
= p == p'
或类似的替代品。
关于haskell - 是否可以使用 haskell-gi 比较两个 gobject 并找出它们是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44164600/