لماذا لا كلا الإصدارين من هذا الرمز عدم فحص بيرل -c؟

StackOverflow https://stackoverflow.com/questions/2255495

  •  20-09-2019
  •  | 
  •  

سؤال

وطريقة new من Parse::RecDescent له هذا النموذج:

sub new ($$$)
{
   # code goes here
}

وإذا كنت إنشاء كائن مثل هذا:

my $parser = Parse::RecDescent->new($grammar);

وأنه سيخلق محلل، وسوف طريقة الحصول على 2 المعلمات "تحليل :: RecDescent" و$ النحو والصحيح؟ إذا حاولت إنشاء كائن مثل:

Parse::RecDescent::new("Parse::RecDescent",$grammar)

وهذا ستفشل قائلا "الحجج غير كافية لتحليل :: :: RecDescent الجديد"، وأنا أفهم هذه الرسالة. أنا فقط يمر 2 المعلمات. ومع ذلك، وأنا لا أفهم لماذا يعمل النسخة السهم.

هل يمكن ان توضح؟

هل كانت مفيدة؟

المحلول

لم يتم تحديد

ونماذج وظيفة عندما كنت اسميها كطريقة على غرار OO. وبالإضافة إلى ذلك، يمكنك تجاوز فحص النموذج عند استدعاء الفرعية مع و، كما هو الحال في &sub(arg0, arg1..);

perldoc perlsub :

<اقتباس فقرة>   

وفالامر لا يقتصر على "&" شكل جعل اختياري قائمة وسيطة، فإنه يعطل أيضا أي فحص أولي على حجج لم تقدمها. ويرجع ذلك جزئيا ل   أسباب تاريخية، وجزئيا عن وجود وسيلة مريحة للغش إذا كنت تعرف ما تفعلونه. انظر نماذج أدناه.

     لا تتأثر

والمكالمات الطريقة التي النماذج سواء، وذلك لأن وظيفة ليتم استدعاؤها هي غير محدد في وقت الترجمة، منذ رمز المحدد دعا يعتمد على الميراث.

وعلى الرغم Parse::RecDescent::new("Parse::RecDescent", $grammar) غير صحيحة نحويا، وهذا هو الطريق رائحة كريهة جدا من استدعاء منشئ، والآن أنت مما اضطرها إلى تعريف في تلك الفئة (بدلا من سلف). إذا كنت حقا بحاجة للتحقق من صحة حججك، أن تفعل ذلك داخل الأسلوب:

sub new
{
    my ($class, @args) = @_;
    die "Not enough arguments passed to constructor" if @args < 2;
    # ...
}

وانظر أيضا هذا سؤال سابق على نماذج والسبب أنها ليست عادة مثل فكرة عظيمة.

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