स्पष्ट रूप से नंगे शब्द (जिसे एक स्ट्रिंग के रूप में माना जाता है) का उपयोग करने के बजाय कक्षा के नाम को उद्धृत करना सिंटैक्टिक अस्पष्टता से बचने के तीन तरीकों में से एक है। लागू कक्षा के तरीके की धारा perlobj प्रलेखन बताते हैं।
क्योंकि पर्ल आपको पैकेज के नाम और सबरूटीन नामों के लिए नंगे पासवर्ड का उपयोग करने की अनुमति देता है, यह कभी-कभी गलत तरीके से नंगेपन के अर्थ की व्याख्या करता है। उदाहरण के लिए, निर्माण की Class->new()
व्याख्या 'Class'->new()
या तो की जा सकती है Class()->new()
। अंग्रेजी में, दूसरी व्याख्या के रूप में लिखा जाता है कि "एक सबरूटीन को Class()
कॉल करें, फिर new()
वापसी के मूल्य पर एक विधि के रूप में कॉल करें Class()
।" यदि Class()
वर्तमान नामस्थान में एक सबरूटीन नाम है, तो पर्ल हमेशा Class->new()
दूसरे विकल्प के रूप में व्याख्या करेगा : कॉल
new()
पर लौटी वस्तु पर कॉल Class()
।
नीचे डेमो के साथ कार्रवाई में इस विषम मामले को देखें।
#! /usr/bin/env perl
use strict;
use warnings;
sub Type::Tiny { print "Returning Bogus\n" ; return "Bogus" }
sub Type::Tiny::new { print "Type::Tiny::new\n" }
sub Bogus::new { print "Bogus::new\n" }
my $class = "Type::Tiny";
Type::Tiny->new;
Type::Tiny::->new;
"Type::Tiny"->new;
$class->new;
इसका आउटपुट है
बोगस लौटना
नकली :: नई
प्रकार :: टिनी :: नई
प्रकार :: टिनी :: नई
प्रकार :: टिनी :: नई
बाकी उल्लिखित प्रलेखन खंड दिखाता है कि आश्चर्यजनक व्यवहार या अनजाने त्रुटियों से कैसे बचाव किया जाए।
आप पर्ल को दो तरीकों से पहली व्याख्या ( अर्थात , कक्षा नाम की विधि के रूप "Class"
में) का उपयोग करने के लिए बाध्य कर सकते हैं। सबसे पहले, आप ::
वर्ग के नाम में एक संलग्न कर सकते हैं :
Class::->new()
पर्ल हमेशा एक विधि कॉल के रूप में इसकी व्याख्या करेगा।
वैकल्पिक रूप से, आप वर्ग का नाम उद्धृत कर सकते हैं:
'Class'->new()
बेशक, अगर क्लास का नाम स्केलर में है, तो पर्ल सही काम भी करेगा:
my $class = 'Class';
$class->new();
आपके प्रश्न पर लागू, नीचे दी गई सभी कॉल समतुल्य हैं।
Type::Tiny::->new( … );
"Type::Tiny"->new( … );
my $class = "Type::Tiny";
$class->new( … );
::
अंत में आवेदन करने से एक सहायक चेतावनी के उत्पादन का लाभ होता है। आप गलती से टाइप करें
Type::Tinny::->new;
वह पैदा करता है
बेयरवर्ड "टाइप :: टिन्नी ::" ./try लाइन 15 पर कोई भी स्थिर पैकेज को संदर्भित नहीं करता है।
पैकेज के माध्यम से ऑब्जेक्ट विधि "नया" का पता नहीं लगा सकते हैं "टाइप :: टिननी" (शायद आप "टाइप :: टिननी?) लोड करना भूल गए हैं ।/try लाइन 15 पर।
Foo::->new
, जैसा कि मैंने ikegami से सीखा है।