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.Foo::
memiliki keunggulan yang diperingatkan jikaFoo
bukan paket yang adaFoo->
Anda, Anda dapat diharapkan untuk mengetahui bahwa tidak ada subrutin seperti itu dalam paket Anda. Tetapi jika Anda menggunakan Try :: Tiny dan sejumlah cpan lain / modul eksternal lainnya, siapa bilang jika salah satunya menggunakan paket Try, dan jika demikian, jika ada sub Tiny di dalamnya?Secara eksplisit mengutip nama kelas daripada menggunakan kata kunci (yang diperlakukan sebagai string) adalah salah satu dari tiga cara untuk menghindari ambiguitas sintaksis. Itu Metode Kelas Meminta dari dokumentasi perlobj menjelaskan.
Lihat kasus aneh ini dalam aksi dengan demo di bawah ini.
Outputnya adalah
Bagian dokumentasi yang disebutkan di atas menunjukkan bagaimana melindungi dari perilaku yang mengejutkan atau kesalahan yang tidak disengaja.
Menerapkan pertanyaan Anda, semua panggilan di bawah ini setara.
Menambahkan
::
sampai akhir memiliki keuntungan menghasilkan peringatan yang bermanfaat. Katakanlah Anda tidak sengaja mengetikItu menghasilkan
sumber