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 中的 Inheritance 或 Extension 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
我从 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 中的 Inheritance 或 Extension 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