কিছু ব্যবহারকারী কেন পার্লের ক্লাসের নামগুলি উদ্ধৃত করে?


12

এদিকে তাকিয়ে Type::Tinyআমি দেখতে পাচ্ছি যে কলটিতে ক্লাসের নামটি Type::Tiny->newঅফিসিয়াল ডক্সে উদ্ধৃত হয়েছে,

my $NUM = "Type::Tiny"->new(
   name       => "Number",
   constraint => sub { looks_like_number($_) },
   message    => sub { "$_ ain't a number" },
);

কেন? এটা কি নিছক স্টাইল? এই অনুশীলনের জন্য কোনও পারফরম্যান্স রামফিকেশন রয়েছে কি?

উত্তর:


7

একটি সহজ উদাহরণ নিন

package Foo { sub new { die 7  } };
package Bar { sub new { die 42 } };
sub Foo { "Bar" }
Foo->new();

উপরের উদাহরণে ধ্রুবকটি Foo"বার" -এর সাথে সমাধান হয়, সুতরাং এটি কল করে "Bar"->newনা "Foo"->new। সাব্রোটিনকে সমাধান থেকে কীভাবে থামবেন? আপনি এটি উদ্ধৃত করতে পারেন।

"Foo"->new();

পারফরম্যান্সের সাথে জড়িত থাকার বিষয়টি, খালি শব্দটির চেয়ে স্ট্রিং ব্যবহার করে জিনিসগুলিকে আরও খারাপ করা হয় না। আমি নিশ্চিত করেছি যে উত্পাদিত অপ্ট্রি O=Deparseএকই রকম। সুতরাং সাধারণ নিয়ম হিসাবে, আপনি যদি সঠিকতার মূল্যায়ন করেন তবে শ্রেণিকামগুলি উদ্ধৃত করা আরও ভাল।

প্রোগ্রামিং পার্লে এটি উল্লেখ করা হয়েছে, (দুঃখের সাথে পরোক্ষ পদ্ধতির প্রার্থনার প্রসঙ্গে )

... সুতরাং আমরা আপনাকে বলব যে আপনি প্রায় সবসময় খালি শ্রেণির নাম দিয়ে চলে যেতে পারেন, তবে দুটি বিষয় সত্য হয়। প্রথমত, শ্রেণীর মতো একই নামের কোনও সাবরোটাইন নেই। (আপনি যদি কনভেনশনটি অনুসরণ করেন যে সাবট্রোটিন নামগুলি newশুরু করার মতো ছোট ছোট অক্ষর এবং ElvenRingপ্রারম্ভের বড় হাতের মতো শ্রেণীর নামগুলি , এটি কখনও কোনও সমস্যা হয় না)। দ্বিতীয়ত, ক্লাসটির একটিতে লোড করা হয়েছিল

use ElvenRing;
require ElvenRing;

এই ঘোষণার যে কোনওটিই নিশ্চিত করে যে পার্ল জানে ElvenRingএমন একটি মডিউল নাম, যা newক্লাসের নামের মতো কোনও খালি নামকে ElvenRingএকটি মেথড কল হিসাবে ব্যাখ্যা করতে বাধ্য করে, এমনকি যদি আপনি newবর্তমান প্যাকেজে নিজের একটি সাব্রোটিন ঘোষণা করেও থাকেন ।

এবং, এর অর্থ উপলব্ধি করে: এখানে আপনার বিভ্রান্তি কেবল তখনই ঘটতে পারে যখন আপনার সাবরুটাইনগুলি (সাধারণত লোয়ারকেস) একই শ্রেণীর (সাধারণত বড়হীন) নাম থাকে। আপনি যদি উপরের নামকরণের কনভেনশন লঙ্ঘন করেন তবেই এটি ঘটতে পারে।

tldr; আপনার ক্লাসের নামগুলি উদ্ধৃত করা সম্ভবত একটি ভাল ধারণা, যদি আপনি সেগুলি জানেন এবং আপনি যদি বিশৃঙ্খলার চেয়ে সঠিকতার মূল্য দেন।

পার্শ্ব দ্রষ্টব্য: বিকল্পভাবে আপনি কোনও ফাংশনটির একটি খালি শব্দটির সমাধানটি এর শেষে একটি সংযুক্ত করে থামাতে পারেন ::, উদাহরণস্বরূপ উপরের ক্ষেত্রে Foo::->new


ধন্যবাদ ক্রেতা আমাকে এই ইশারা জন্য Ginnz , এবং মন্তব্যের জন্য টবি Inkster (যদিও এটি প্রথম পঠিত আমাকে জানার জন্য করা হয়নি)।


2
বা Foo::->new, যেমন আমি ইকেগামি থেকে শিখেছি।
ভিড়

@ মোব হ্যাঁ, পার্ল বইটিতে এটিও উল্লেখ করা হয়েছে (স্পষ্টভাবে), নিশ্চিত না যে আমার সেখানে রাখা উচিত কিনা? হাঃ হাঃ হাঃ.
ইভান ক্যারল

@ মোব আমি এটিও পাদটীকা হিসাবে যুক্ত করেছি। যদিও আমি নিশ্চিত না যে আমি এটি পছন্দ করি।
ইভান ক্যারল

1
Foo::Fooবিদ্যমান সুবিধা রয়েছে এমন প্যাকেজটি না থাকলে এটি সতর্ক করে দেয়
ikegami

1
চেষ্টা করুন :: ফু এর চেয়ে ক্ষুদ্র একটি ভাল উদাহরণ। আপনার কোডটি ব্যবহার করে Foo->আপনার কাছে আশা করা যায় যে আপনার প্যাকেজে এমন কোনও সাবরুটিন নেই। তবে আপনি যদি চেষ্টা করুন: টিনি এবং অন্যান্য কয়েকটি সিপিএন / অন্যান্য বহিরাগত টকযুক্ত মডিউল ব্যবহার করছেন তবে তাদের মধ্যে কেউ একটি ট্রাই প্যাকেজ ব্যবহার করছে কিনা তা কে বলবে এবং যদি তাই হয় তবে এতে যদি একটি ক্ষুদ্র সাব থাকে?
ইস্ট

0

খালি শব্দ ব্যবহার না করে ক্লাসের নামটি স্পষ্টভাবে উদ্ধৃত করা (যা স্ট্রিং হিসাবে বিবেচিত হয়) সিনট্যাকটিক অস্পষ্টতা এড়ানোর তিনটি পদ্ধতির একটি। Invoking ক্লাস পদ্ধতি বিভাগে perlobj ডকুমেন্টেশন ব্যাখ্যা করে।

যেহেতু পার্ল আপনাকে প্যাকেজ নাম এবং সাবরুটিন নামগুলির জন্য খালি শব্দ ব্যবহার করার অনুমতি দেয়, এটি কখনও কখনও একটি খালি শব্দটির অর্থ ভুলভাবে ব্যাখ্যা করে। উদাহরণস্বরূপ, কনস্ট্রাক্ট Class->new()হিসাবে পারেন ব্যাখ্যা করা যেতে পারে 'Class'->new()বা Class()->new().In ইংরেজি, দ্বিতীয় ব্যাখ্যা হিসাবে সার্চ "নামের একটি সাবরুটিন কল 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()

পার্ল সর্বদা এটি একটি পদ্ধতি কল হিসাবে ব্যাখ্যা করবে interpret

বিকল্পভাবে, আপনি শ্রেণীর নামটি উদ্ধৃত করতে পারেন:

'Class'->new()

অবশ্যই, শ্রেণীর নামটি যদি স্কেলারে থাকে তবে পার্ল সঠিক কাজটিও করবে:

my $class = 'Class';
$class->new();

আপনার প্রশ্নের প্রয়োগ করে, নীচের সমস্ত কল সমান।

Type::Tiny::->new(  );

"Type::Tiny"->new(  );

my $class = "Type::Tiny";
$class->new(  );

::শেষের দিকে সংযোজনে একটি সহায়ক সতর্কতা তৈরির সুবিধা রয়েছে। বলুন আপনি দুর্ঘটনাক্রমে টাইপ করেছেন

Type::Tinny::->new;

যে উত্পাদন করে

বারিওয়ার্ড "টাইপ করুন :: টিনি ::"। / চেষ্টা লাইনে 15 এ অস্তিত্বহীন প্যাকেজকে বোঝায়।
প্যাকেজ "টাইপ করুন :: তিন্নি" এর মাধ্যমে অবজেক্ট পদ্ধতি "নতুন" সনাক্ত করা যায় না (সম্ভবত আপনি "টাইপ করুন: টিনি" লোড করতে ভুলে গিয়েছিলেন।) / লাইন 15 এ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.