سؤال

التورية جانبا، وأنا أحاول تنفيذ import الطريقة في صف Perl الخاص بي لإنشاء مثيل لـ Data كائن، وهو في الأساس مصفوفة مجيدة من التجزئة، من مجموعة مناسبة من التجزئة.

فيما يلي مثال على كيفية التخطيط لاستخدامه:

# Pull in the data
my $data = Data->import(
                         [
                           { a => 1, b => 7, c => 3},
                           { a => 7, b => 9, c => 2},
                         ]
                       );

$data->manipulate;  # Use package methods

لي import التنفيذ على النحو التالي:

package Data;

sub initialize {
    my $class = shift;
    my $data = [];
    bless $data, $class;
    return $data;
}

sub import {

    my ( $class, $data ) = @_;

    bless $data, $class;
    return $data;
}

1;

الشيء المثير للدهشة هو أن بيرل أبلغ عن الخطأ في ترجمة-وقت (لاحظ ال BEGIN حاجز):

Can't bless non-reference value at Data.pm line 51.
BEGIN failed--compilation aborted at myScript.pl line 8.

perldiag لم يضيف الكثير من الوضوح لما يحدث:

لا يمكن أن يبارك القيمة غير المرجعية

(F) فقط المراجع الصعبة قد تكون مباركة.هذه هي الطريقة التي تُغليف "فرض" "بيرل" بتغليف الكائنات.يرى perlobj.


حتى أنني حاولت تهيئة الكائن وإضافة البيانات في خطوتين منفصلتين:

sub import {                         #< Another constructor >

    my ( $class, $data ) = @_;

    my $obj = $class->initialize;
    push @$obj, @$data;

    return $obj;
}

أدى ذلك إلى الخطأ التالي في وقت الترجمة:

Can't use an undefined value as an ARRAY reference...
BEGIN failed--compilation aborted at...

سؤالين:

  1. ما العيب فيما فعلته؟
  2. يمكن للشخص يرجى توضيح perldiag شرح لهذا الخطأ وقت الترجمة؟
هل كانت مفيدة؟

المحلول

يعد import() اسمًا خطيرًا لإعطاء طريقة، حيث يستدعي Perl أحيانًا طريقة تسمى "import" لك.والحقيقة أن البيان:

use Data;

يعني حقا:

BEGIN {
    require Data;
    Data->import();
}

الذي يحدث أثناء "التجميع".

لذلك من المحتمل أن يتم استدعاء أسلوب الاستيراد () الخاص بك بواسطة Perl كجزء من آلية تحميل الفصل قبل أن تحصل على فرصة لاستخدامه.يجب عليك إعادة تسمية طريقة الاستيراد () الخاصة بك إلى شيء آخر (على سبيل المثال.import_data) ويجب أن تكون بخير.

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