Ambil contoh yang lebih sederhana
package Foo { sub new { die 7 } };
package Bar { sub new { die 42 } };
sub Foo { "Bar" }
Foo->new();
Dalam contoh di atas, konstanta Foo
menyelesaikan ke "Bar", jadi ini panggilan "Bar"->new
tidak "Foo"->new
. Bagaimana Anda menghentikan penyelesaian subrutin? Anda bisa mengutipnya.
"Foo"->new();
Adapun implikasi kinerja, hal-hal tidak menjadi lebih buruk dengan menggunakan string daripada kata pengantar. Saya telah mengkonfirmasi bahwa pilihan yang dihasilkan O=Deparse
adalah sama. Jadi sebagai aturan umum, tampaknya akan lebih baik untuk mengutip Classnames jika Anda menghargai kebenaran.
Ini disebutkan dalam Programming Perl, (sayangnya dalam konteks doa metode tidak langsung )
... jadi kami akan memberi tahu Anda bahwa Anda hampir selalu bisa lolos dengan nama kelas yang kosong, asalkan ada dua hal yang benar. Pertama, tidak ada subrutin dengan nama yang sama dengan kelas. (Jika Anda mengikuti konvensi bahwa nama subrutin seperti new
mulai huruf kecil dan nama kelas seperti ElvenRing
mulai huruf besar , ini tidak pernah menjadi masalah). Kedua, kelas telah dimuat dengan salah satu dari
use ElvenRing;
require ElvenRing;
Salah satu deklarasi ini memastikan Perl tahu ElvenRing
adalah nama modul, yang memaksa setiap nama telanjang seperti new
sebelum nama kelas ElvenRing
diinterpretasikan sebagai pemanggilan metode, bahkan jika Anda telah mendeklarasikan new
subrutin Anda sendiri dalam paket saat ini.
Dan, itu masuk akal: kebingungan di sini hanya dapat terjadi jika subrutin Anda (biasanya huruf kecil) memiliki nama yang sama dengan kelas (biasanya huruf besar). Ini hanya dapat terjadi jika Anda melanggar konvensi penamaan di atas.
tldr; mungkin merupakan ide yang bagus untuk mengutip nama kelas Anda, jika Anda mengetahuinya dan Anda menghargai kebenaran dari kekacauan.
Catatan: sebagai alternatif Anda dapat menghentikan resolusi sebuah kata kunci pada suatu fungsi dengan menempelkannya ::
pada akhir kata tersebut, misalnya di atas Foo::->new
.
Terima kasih kepada Ginnz pada reddit karena menunjukkan hal ini kepada saya , dan untuk Toby Inkster atas komentarnya (meskipun itu tidak masuk akal bagi saya saat pertama kali membaca).
Foo::->new
, seperti yang saya pelajari dari ikegami.