سؤال

أحاول كتابة وحدة XS جديدة للبيرل. لقد تم اختبارها من خلال تعليمات كتابة وحدة XS ويعمل بشكل جيد.

أنا غير قادر على فهم كيفية الكتابة new طريقة XS.

لدي حزمة تسمى Agent. وبعد أريد أن أكون قادرا على شيء مثل هذا:

my $agent_object = new Agent;
هل كانت مفيدة؟

المحلول

حصلت على الجواب من ميكانيكا XS.

شكرا لمساعدتك

نصائح أخرى

البرمز التالي ينفذ نموذجا نموذجيا

sub new {
  my $class = shift;
  return bless {@_} => $class;
}

منشئ في XS. انها نسخ حرفي من الطبقة :: xsaccessor.. وبعد أود أن أقترح عليك التحقيق في الفصل :: 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));

إذا كان وكيلك.xs يحتوي على:

class Agent {
public:
  Agent() {
    // constructor stuff
  }

لا تطلق XS هذا المنشئ تلقائيا عندما تقول وكيل> جديد؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top