Saya menghabiskan banyak waktu debugging skrip baru-baru ini, dan ketika saya akhirnya menemukan masalah itu karena kode yang terlihat seperti ini:
class Foo {
has $.bar;
method () {
# do stuff
$!.bar;
}
}
Ternyata masalahnya adalah dengan itu $!.bar
, yang seharusnya $!bar
atau $.bar
. Saya mengerti.
Tapi mengapa ini tidak mati ?
Melihat ini secara lebih detail, sepertinya masalah di sini adalah bahwa saya sedang mencoba untuk memanggil (tidak ada) metode bar
pada $!
, yang pada saat ini adalah Nil
karena belum ada kesalahan.
Dan sepertinya saya benar-benar dapat memanggil metode apa pun yang saya inginkan Nil
dan mereka semua diam-diam kembali Nil
, termasuk hal-hal seperti Nil.this-is-a-fake-method
dan Nil.reverse-entropy(123)
.
Apakah ini fitur? Jika demikian, apa alasannya?
Nil
pengembalianNil
, sehinggaNil
menyebarkan rantai panggilan metode turun." Jadi ini dimaksudkan agar Anda dapat melakukan$foo.Bar().Baz().Blah()
tanpa perlu tes nil di setiap langkah atau?.
jenis operator khusus (selama Anda benar menangani nil di akhir). Saya akan mengeditnya, terima kasih.Nil
yang tidak kesalahan dan hanya melempar kembaliNil
mendapatkan penggunaan yang cukup luas di Obj-C dan NS Frameworks di mana ia digunakan dengan cara yang sama - memungkinkan untuk panggilan berantai yang terus melewati Nil. Saya tidak tahu hukuman kinerja yang tepat dari pengecualian dan menangkapnya, tetapi dugaan saya adalah bahwaNil
rantai dapat lebih efisien, jika kurang fleksibel.Nil
kelas memilikiFALLBACK
docs.raku.org/language/typesystem#index-entry-FALLBACK_(method) metode, yang kembaliNil
. Pada dasarnya, tepat sebelum pengecualian dilemparkan karena metode tidak dapat ditemukan, pemeriksaanFALLBACK
dilakukan, dan dipanggil jika tersedia.Pertanyaan ini (dan jawaban hobbs) juga membuat saya merasa ... gelisah: Saya akhirnya menemukan https://docs.raku.org/language/traps : ini menjelaskan bahwa penetapan
Nil
menghasilkan nilai yang berbeda, biasanyaAny
. Interaksi dasar REPL berikut juga menunjukkan ini:((perbedaan antara
=
dan:=
dibahas di sini: https://docs.raku.org/language/containers#Binding ))... jadi ide umumnya adalah bahwa 'nilai absen atau kegagalan jinak' jauh lebih luas dalam kode reguler daripada saya (dan mungkin Anda juga?) tiba-tiba takut: itu memang terjadi, ketika Anda akan bekerja dengan regex cocok secara langsung dan dalam situasi tak disengaja khusus Anda terkait dengan metode langsung memohon
$!
.Ini membuat saya lebih sadar tentang perbedaan antara
Nil
danAny
, dan alasan yang diberikan lebih masuk akal bagi saya.sumber
Nil
mengatur wadah ke status default-nya. Anda dapat mengubah nilai default.my $foo is default(42) = 5;
$foo = Nil;
say $foo; # 42