पर्ल को ऐसा करने में थोड़ी मदद की आवश्यकता होगी। क्योंकि यह हैश में संग्रहीत कोड संदर्भों को "विधियों" के रूप में नहीं मानता है। एक पैकेज प्रतीक तालिका में प्रविष्टियों के रूप में तरीके लागू किए जाते हैं।पर्ल अधिक जावास्क्रिप्ट की तुलना में कक्षा-उन्मुख है, जो गर्व से यह घोषणा करता है कि यह ऑब्जेक्ट-ओरिएंटेड (व्यक्तिगत ऑब्जेक्ट्स पर) है।
उस कार्यक्षमता को करने के लिए, आपको एक कक्षा बनाना होगा जो इस तरह से संदर्भित मैप किए जाएंगे। प्रतीक तालिका में चारों ओर विधियों को पाने का तरीका AUTOLOAD
विधि है। यदि किसी पैकेज में AUTOLOAD
सबराउटिन होता है, जब किसी धन्य ऑब्जेक्ट पर कॉल किया जाता है जिसे पर्ल विरासत श्रृंखला में नहीं मिल पाती है, तो यह AUTOLOAD
पर कॉल करेगी और पैकेज-स्कोप्ड (our
) चर $AUTOLOAD
सेट करें पूर्ण नाम का नाम होगा समारोह।
हमें पूरी तरह से योग्य उप नाम के अंतिम नोड (अंतिम '::' के बाद) नामक विधि का नाम मिलता है। हम देखते हैं कि उस स्थान पर एक कोडफ्रफ़ है या नहीं, और यदि वहां है, तो हम इसे वापस कर सकते हैं।
package AutoObject;
use strict;
use warnings;
use Carp;
use Params::Util qw<_CODE>;
our $AUTOLOAD;
sub AUTOLOAD {
my $method_name = substr($AUTOLOAD, index($AUTOLOAD, '::') + 2);
my ($self) = @_;
my $meth = _CODE($self->{$method_name});
unless ($meth) {
Carp::croak("object does not support method='$method_name'!");
}
goto &$meth;
}
1;
तो फिर तुम उस वर्ग में वस्तु आशीर्वाद होगा:
package main;
my $obj
= bless { foo => 1
, hello => sub { return 'world' }
}, 'AutoObject';
print $obj->hello();
आम तौर पर, एक AUTOLOAD
उप में मैं "सीमेंट" व्यवहार। यही है, अगली बार AUTOLOAD
से बचने के लिए, मैं पैकेज प्रतीक तालिका में प्रविष्टियां बनाता हूं। लेकिन यह आमतौर पर एक उचित परिभाषित वर्ग व्यवहार के लिए है।
मैंने QuickClass
भी डिज़ाइन किया है जो प्रत्येक ऑब्जेक्ट के लिए एक पैकेज बनाता है, लेकिन इसमें बहुत सी प्रतीकात्मक तालिका है जो अब Class::MOP
के साथ बेहतर है।
एरिक स्ट्रॉम द्वारा दिए गए सुझाव को देखते हुए, आप निम्न कोड ऑटोऑब्जेक्ट पैकेज में जोड़ सकते हैं। import
उप किसी को कभी भी use
-d AutoObject
(पैरामीटर 'object'
के साथ) कहा जाएगा।
# Definition:
sub object ($) { return bless $_[0], __PACKAGE__; };
sub import { # gets called when Perl reads 'use AutoObject;'
shift; # my name
return unless $_[0] eq 'object'; # object is it's only export
use Symbol;
*{ Symbol::qualify_to_reference('object', scalar caller()) }
= \&object
;
}
और तब, जब आप एक "शाब्दिक वस्तु" बनाना चाहता था, तो आप सिर्फ कर सकता है:
use AutoObject qw<object>;
और अभिव्यक्ति होगा:
object { foo => 1, hello => sub { return 'world' } };
तुम भी कर सकता है :
object { name => 'World'
, hello => sub { return "Hello, $_[0]->{name}"; }
}->hello()
;
और आपके पास "ऑब्जेक्ट" है शाब्दिक "अभिव्यक्ति। शायद मॉड्यूल बेहतर होगा Object::Literal
।
पर्ल तरीकों हैश पर खेतों नहीं हैं - यह जावा नहीं है। – Ether
जावास्क्रिप्ट या तो जावा नहीं है। – cjm