Lấy một ví dụ đơn giản hơn
package Foo { sub new { die 7 } };
package Bar { sub new { die 42 } };
sub Foo { "Bar" }
Foo->new();
Trong ví dụ trên, hằng số phân Foo
giải thành "Bar", vì vậy điều này gọi là "Bar"->new
không "Foo"->new
. Làm thế nào để bạn ngăn chặn chương trình con giải quyết? Bạn có thể trích dẫn nó.
"Foo"->new();
Đối với hàm ý hiệu suất, mọi thứ không trở nên tồi tệ hơn bằng cách sử dụng một chuỗi chứ không phải là một bareword. Tôi đã xác nhận optree được tạo bởi O=Deparse
là như nhau. Vì vậy, theo nguyên tắc chung, có vẻ tốt hơn để trích dẫn các Tên lớp nếu bạn coi trọng tính chính xác.
Điều này được đề cập trong Lập trình Perl, (đáng buồn là trong bối cảnh gọi phương thức gián tiếp )
... Vì vậy, chúng tôi sẽ nói với bạn rằng bạn hầu như luôn có thể thoát khỏi một tên lớp trần, với điều kiện hai điều là đúng. Đầu tiên, không có chương trình con cùng tên với lớp. (Nếu bạn tuân theo quy ước rằng các tên chương trình con như new
bắt đầu chữ thường và tên lớp như ElvenRing
bắt đầu chữ hoa , thì điều này không bao giờ là vấn đề). Thứ hai, lớp đã được tải với một trong
use ElvenRing;
require ElvenRing;
Một trong những khai báo này đảm bảo rằng Perl biết ElvenRing
là một tên mô-đun, nó buộc bất kỳ tên trần nào giống như new
trước khi tên lớp ElvenRing
được hiểu là một cuộc gọi phương thức, ngay cả khi bạn đã khai báo một new
chương trình con của chính bạn trong gói hiện tại.
Và, điều đó có ý nghĩa: sự nhầm lẫn ở đây chỉ có thể xảy ra nếu các chương trình con của bạn (thường là chữ thường) có cùng tên với một lớp (thường là chữ hoa). Điều này chỉ có thể xảy ra nếu bạn vi phạm quy ước đặt tên ở trên.
tldr; có lẽ là một ý tưởng tốt để trích dẫn tên lớp của bạn, nếu bạn biết chúng và bạn đánh giá cao sự đúng đắn trên sự lộn xộn.
Lưu ý bên lề: thay vào đó, bạn có thể dừng độ phân giải của một bareword cho một chức năng bằng cách gắn một ::
đến cuối của nó, ví dụ như ở trên Foo::->new
.
Cảm ơn Ginnz trên reddit đã chỉ ra điều này cho tôi và Toby Inkster cho nhận xét (mặc dù nó không có ý nghĩa với tôi trong lần đọc đầu tiên).
Foo::->new
, như tôi đã học được từ ikegami.