Crystal : class 扭曲或扩展方法,如 CSharp

Crystal : class warp or extension methods like CSharp

我从 C 库导出了一个结构,它是 Void*

lib LibXXX
    alias OldStruct = Pointer(Void)
    fun foo(old : OldStruct)
end

并且想添加一些方法到LibXXX::Old

我知道在大多数语言中这只能通过 class 扭曲来完成:

struct NewStruct {
    OldStruct old;
    void new_functions();
};

但我必须显式访问字段 old 真的很麻烦。 LibXXX.foo(old.old)

我想要一些保持简单表示的透明方式 LibXXX.foo(old),例如 CSharp 中的 InheritanceExtension Methods

我试过了:

struct NewStruct < LibXXX::Old
# ...
end

但是出现编译错误:

can't extend non-abstract struct Pointer(Void)

我相信一定可以使用 Crystal 来完成。但我不知道什么是最佳实践,所以,请。

最佳做法是在您的对象周围使用非 lib 包装器,它包装所有现有方法。这通常也是添加新功能或任何惯用抽象的好地方。

lib LibPet
  alias Pet = Void*
  alias Dog = Void*

  fun make_dog : Dog
  fun bark(bar : Dog)
  fun move(pet : Pet)
  fun retreat(pet : Pet)
end

struct Dog
  def initialize
    @dog = LibPet.make_dog
  end

  def bark
    LibPet.bark(@dog)
  end

  def move
    LibPet.move(@dog)
  end

  def retreat
    LibPet.retreat(@dog)
  end

  def at_front
    move
    yield
  ensure
    retreat
  end

  def attack
    at_front { bark }
  end
end