मैं एक पैकेज My::Pkg
कहा जाता है कहते हैं, और कहा कि पैकेज नई वस्तुओं का दृष्टांत के लिए एक ->new(...)
वर्ग विधि है:पर्ल में, क्या पैकेज के समान नाम के साथ सबराउटिन बनाने में कोई हानि है?
package My::Pkg;
sub new {bless {@_[1..$#_]} => $_[0]}
वहाँ निम्नलिखित सबरूटीन को परिभाषित करने में कोई नुकसान है:
sub My::Pkg {@_ ? My::Pkg::new('My::Pkg', @_) : 'My::Pkg'}
तो है कि किसी को लिख सकते हैं:
my $obj = My::Pkg one => 1, two => 2;
के बजाय:
my $obj = My::Pkg->new(one => 1, two => 2); # which still works, but is longer
मुझे पैकेज-नाम-कन्स्ट्रक्टर-सबराउटिन विधि की चतुरता पसंद है, लेकिन मुझे यह जानने में दिलचस्पी है कि इस तकनीक के लिए कोई छुपा गेटचा है या नहीं, जिस पर मैंने सोचा नहीं है।
अद्यतन:
विरासत, ठीक से काम करता के रूप में उदाहरण के यहाँ से दिखाया गया है:
{package a; sub new {say "a::new [@_] ", $_[0]->init}}
{package b; our @ISA = 'a'; sub init {"(b::init [@_])"}}
{package a::b; our @ISA = 'b';}
sub a::b {print "absub [@_], "; 'a::b'}
# a::b() called with no args, returns 'a::b', which then becomes 'a::b'->new(...)
a::b->new; # absub [], a::new [a::b] (b::init [a::b])
a::b->new(1, 2, 3); # absub [], a::new [a::b 1 2 3] (b::init [a::b])
# no call to `a::b()` but otherwise the same:
'a::b'->new; # a::new [a::b] (b::init [a::b])
'a::b'->new(1, 2, 3); # a::new [a::b 1 2 3] (b::init [a::b])
new a::b::; # a::new [a::b] (b::init [a::b])
new a::b:: 1, 2, 3; # a::new [a::b 1 2 3] (b::init [a::b])
दिलचस्प बात यह है केवल एक चीज है कि अब तक अलग है कि निम्नलिखित 2 लाइनों वाक्यविन्यास त्रुटियों बन रहा है:
new a::b;
new a::b 1, 2, 3;
इसी कारण से एक वाक्यविन्यास त्रुटि है some_undefined_sub some_defined_sub;
एक है।
यदि new
सबराउटिन परिभाषित किया गया है, तो इसे new(a::b(...))
के रूप में पार्स किया गया है जो दो आसन्न बेवकूफ सबराउटिन के लिए सामान्य है।
व्यक्तिगत रूप से, मैं new a::b
में सिंटेक्स त्रुटि बनने के साथ ठीक हूँ, स्पष्ट संस्करण new a::b::
हमेशा tchrist काम आते हुए नीचे की ओर इशारा रूप में काम करेंगे।
साफ दिखता है। अगर कुछ विफल होना था, तो यह 'some_sub मेरा :: पीकेजी ए => 1, बी => 2; 'होगा। यह नहीं है – ikegami
@ikegami: यह निश्चित रूप से ** DOES ** विफल रहता है: 'उप एक्स :: वाई {मर" एक्स :: वाई() जिसे \ n "} उप एक्स :: वाई :: नया {चेतावनी" एक्स :: वाई :: नया() कहा जाता है \ n "} उप नया {मर" मुख्य :: नया() "} $ ए = नया एक्स :: वाई" व्यवसाय "कहा जाता है; चेतावनी देते हैं कि "$ एक प्राप्त हुआ"; 'मर जाएगा ... क्योंकि यह' मुख्य :: नया (एक्स :: वाई ("व्यवसाय")) 'को ठीक से' एक्स :: वाई :: नया ("एक्स: : वाई "," व्यवसाय ")) 'एक विधि के रूप में। इसके अलावा, subroutine कॉल विरासत का सम्मान नहीं करता है जैसा ओओ दुनिया में अनिवार्य माना जाता है। – tchrist
यह बुरा है कि 'नया एक्स :: वाई "व्यवसाय" अचानक' एक्स :: वाई-> नया ("व्यवसाय") '- * से कुछ अलग है जिसका अर्थ है * बीटीडब्ल्यू वास्तव में अब' एक्स :: वाई() - > 'एक्स :: वाई :: नया ("एक्स :: वाई", "व्यवसाय") के बजाय नया ("व्यवसाय") 'हर कोई सोचता है कि इसका मतलब है। – tchrist