การอ้างชื่อคลาสอย่างชัดเจนแทนที่จะใช้ bareword (ซึ่งถือว่าเป็นสตริง) เป็นหนึ่งในสามวิธีในการหลีกเลี่ยงความคลุมเครือทางไวยากรณ์ อัญเชิญวิธีการเรียนส่วนหนึ่งของเอกสาร perlobjอธิบาย
เนื่องจาก Perl อนุญาตให้คุณใช้ barewords สำหรับชื่อแพ็กเกจและชื่อรูทีนย่อยบางครั้งก็ตีความความหมายของ bareword อย่างไม่ถูกต้อง ตัวอย่างเช่นการสร้างClass->new()
สามารถตีความได้ว่าเป็นอย่างใดอย่างหนึ่ง'Class'->new()
หรือClass()->new()
. ในภาษาอังกฤษการตีความที่สองอ่านว่า "เรียกรูทีนย่อยชื่อClass()
แล้วเรียกnew()
ว่าเป็นวิธีการเกี่ยวกับค่าตอบแทนของClass()
." หากมีการย่อยชื่อClass()
ใน namespace ปัจจุบัน Perl มักจะตีความ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;
เอาท์พุทมันคือ
เป็นการหลอกลวง
ปลอม :: ใหม่
ประเภท :: จิ๋ว :: ใหม่
ประเภท :: จิ๋ว :: ใหม่
ประเภท :: จิ๋ว :: ใหม่
ส่วนที่เหลือของส่วนเอกสารดังกล่าวแสดงวิธีการป้องกันพฤติกรรมที่น่าแปลกใจหรือข้อผิดพลาดโดยไม่ตั้งใจ
คุณสามารถบังคับให้ Perl ใช้การตีความแรก ( เช่นการเรียกเมธอดบนคลาสที่มีชื่อ"Class"
) ได้สองวิธี ก่อนอื่นคุณสามารถต่อท้าย::
ชื่อคลาสได้:
Class::->new()
Perl จะตีความสิ่งนี้เป็นการเรียกเมธอดเสมอ
หรือคุณสามารถอ้างอิงชื่อคลาสได้:
'Class'->new()
แน่นอนถ้าชื่อคลาสอยู่ในสเกลาร์ Perl จะทำสิ่งที่ถูกต้องเช่นกัน:
my $class = 'Class';
$class->new();
นำไปใช้กับคำถามของคุณการโทรทั้งหมดด้านล่างนี้เทียบเท่ากัน
Type::Tiny::->new( … );
"Type::Tiny"->new( … );
my $class = "Type::Tiny";
$class->new( … );
การผนวก::
ไปยังจุดสิ้นสุดมีประโยชน์ในการสร้างคำเตือนที่มีประโยชน์ สมมติว่าคุณพิมพ์โดยไม่ตั้งใจ
Type::Tinny::->new;
ที่ผลิต
Bareword "Type :: Tinny ::" หมายถึงแพ็คเกจที่ไม่มีอยู่ที่. / ลองบรรทัดที่ 15
ไม่สามารถหาวิธีวัตถุ "ใหม่" ผ่านแพคเกจ "ประเภท :: Tinny" (บางทีคุณลืมโหลด "Type :: Tinny"?) ที่. / ลองบรรทัดที่ 15
Foo::->new
อย่างที่ฉันเรียนรู้จาก ikegami