সমস্যাটি হ'ল পার্লের ফাংশন প্রোটোটাইপগুলি লোকেরা যা মনে করে তা করে না। তাদের উদ্দেশ্য আপনাকে পার্কের অন্তর্নির্মিত ফাংশনগুলির মতো পার্স করা ফাংশনগুলি লেখার মঞ্জুরি দেওয়া।
প্রথমত, পদ্ধতি কলগুলি প্রোটোটাইপগুলিকে সম্পূর্ণ উপেক্ষা করে। যদি আপনি ওও প্রোগ্রামিং করে থাকেন তবে আপনার পদ্ধতিগুলির প্রোটোটাইপ কী তা বিবেচ্য নয়। (সুতরাং তাদের কোনও প্রোটোটাইপ না থাকা উচিত))
দ্বিতীয়ত, প্রোটোটাইপগুলি কঠোরভাবে প্রয়োগ করা হয় না। আপনি যদি একটি সাব্রুটিন সাথে কল করেন &function(...)
তবে প্রোটোটাইপটিকে উপেক্ষা করা হবে। সুতরাং তারা সত্যিই কোনও ধরণের সুরক্ষা সরবরাহ করে না।
তৃতীয়ত, এগুলি দূরত্বে অদ্ভুত ক্রিয়া। (বিশেষত $
প্রোটোটাইপ, যার ফলে সংশ্লিষ্ট পরামিতিগুলি ডিফল্ট তালিকার প্রেক্ষাপটের পরিবর্তে স্কেলারের প্রসঙ্গে মূল্যায়ন করতে পারে))
বিশেষত, অ্যারে থেকে প্যারামিটারগুলি পাস করা তারা কঠিন করে তোলে। উদাহরণ স্বরূপ:
my @array = qw(a b c);
foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);
sub foo ($;$$) { print "@_\n" }
foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);
কপি করে প্রিন্ট:
a b c
a b
a b c
3
b
a b c
3 টি সতর্কতা সহ main::foo() called too early to check prototype
(যদি সতর্কতা সক্ষম হয়)। সমস্যাটি হল যে স্কেলার প্রসঙ্গে মূল্যায়ন করা একটি অ্যারে (বা অ্যারে স্লাইস) অ্যারের দৈর্ঘ্য ফেরত দেয়।
যদি আপনাকে এমন কোনও ফাংশন লিখতে হয় যা বিল্ট-ইন এর মতো কাজ করে তবে একটি প্রোটোটাইপ ব্যবহার করুন। অন্যথায়, প্রোটোটাইপ ব্যবহার করবেন না।
দ্রষ্টব্য: পার্ল 6 এর সম্পূর্ণ পুনর্নির্মাণ এবং খুব দরকারী প্রোটোটাইপ থাকবে। এই উত্তরটি কেবল পার্ল 5 এর জন্য প্রযোজ্য।