我正在嘗試爲Perl編寫新的XS模塊。我已經通過以下XS模塊寫入說明進行了測試,並且工作正常。如何在XS中編寫Perl構造函數?
我不能夠理解我如何編寫XS
new
方法我有一個名爲Agent
包。我希望能是這樣的:
my $agent_object = new Agent;
我正在嘗試爲Perl編寫新的XS模塊。我已經通過以下XS模塊寫入說明進行了測試,並且工作正常。如何在XS中編寫Perl構造函數?
我不能夠理解我如何編寫XS
new
方法我有一個名爲Agent
包。我希望能是這樣的:
my $agent_object = new Agent;
我從XS Mechanics得到了答案。
感謝您的幫助
如果您Agent.xs包含:
class Agent {
public:
Agent() {
// constructor stuff
}
不XS自動調用構造函數時,你說代理 - >新?
不是。但看看ExtUtils :: XSpp。這可以做到。 – tsee
下面的代碼實現了XS典型
sub new {
my $class = shift;
return bless {@_} => $class;
}
構造。它是從Class::XSAccessor逐字複製的。我建議你調查Class :: XSAccessor的情況下,當您使用普通的基於散列的對象。沒有必要重新發明這個輪子。
void
new(class, ...)
SV* class;
PREINIT:
unsigned int iStack;
HV* hash;
SV* obj;
const char* classname;
PPCODE:
if (sv_isobject(class)) {
classname = sv_reftype(SvRV(class), 1);
}
else {
if (!SvPOK(class))
croak("Need an object or class name as first argument to the constructor.");
classname = SvPV_nolen(class);
}
hash = (HV *)sv_2mortal((SV *)newHV());
obj = sv_bless(newRV((SV*)hash), gv_stashpv(classname, 1));
if (items > 1) {
if (!(items % 2))
croak("Uneven number of argument to constructor.");
for (iStack = 1; iStack < items; iStack += 2) {
hv_store_ent(hash, ST(iStack), newSVsv(ST(iStack+1)), 0);
}
}
XPUSHs(sv_2mortal(obj));
一般情況下,避免使用間接對象符號,只需使用'Agent-> new'。 –