Spędziłem ostatnio dużo czasu na debugowaniu skryptu, a kiedy w końcu znalazłem problem, przyczyną był kod, który wyglądał tak:
class Foo {
has $.bar;
method () {
# do stuff
$!.bar;
}
}
Okazało się, że problem był z $!.bar
, który powinien być albo $!bar
albo $.bar
. Rozumiem.
Ale dlaczego to nie umiera ?
Patrząc na to w sposób bardziej szczegółowy, wygląda na to problemu jest to, że staram się wywołać (nieistniejącą) sposób bar
na $!
, która w tym momencie jest Nil
, bo nie było żadnych błędów.
I wygląda na to, że mogę wywołać dowolną metodę, którą chcę, Nil
i wszystkie one po cichu powracają Nil
, w tym rzeczy takie jak Nil.this-is-a-fake-method
i Nil.reverse-entropy(123)
.
Czy to jest funkcja? Jeśli tak, jakie jest uzasadnienie?
Nil
powrocieNil
, dzięki czemuNil
propaguje łańcuchy wywołań metod”. Jest więc zamierzone, abyś mógł to zrobić$foo.Bar().Baz().Blah()
bez potrzeby przeprowadzania zerowych testów na każdym kroku lub specjalnego?.
rodzaju operatora (o ile poprawnie obsługujesz zero na końcu). Przeredaguję to, dziękuję.Nil
, co nie powoduje błędu i po prostu zwraca więcej,Nil
jest dość szeroko stosowane w Obj-C i NS Frameworks, gdzie jest używane w podobny sposób - pozwala na połączenia łańcuchowe, które wciąż przekazują zero. Nie znam dokładnych kar za wyjątki i łapania ich, ale domyślam się, żeNil
tworzenie łańcuchów może być bardziej wydajne, jeśli mniej elastyczne.Nil
Klasa maFALLBACK
docs.raku.org/language/typesystem#index-entry-FALLBACK_(method) metodę, która zwracaNil
. Zasadniczo tuż przed zgłoszeniem wyjątku, ponieważ nie można znaleźć metody, sprawdzaneFALLBACK
jest wykonanie i wywoływane, jeśli jest dostępne.To pytanie (i odpowiedź Hobbsa) również sprawiło, że poczułem się ... zaniepokojony: w końcu znalazłem https://docs.raku.org/language/traps : wyjaśnia, że przypisywanie
Nil
zwykle daje inną wartośćAny
. Wykazuje to również następująca podstawowa interakcja REPL:((różnica między
=
i:=
jest tutaj: https://docs.raku.org/language/containers#Binding ))... więc ogólna idea jest taka, że „nieobecna wartość lub łagodna awaria” jest znacznie mniej rozpowszechniona w zwykłym kodzie, niż ja (a może i ty?) nagle się obawiałem: dzieje się to jednak, gdy zamierzasz pracować z regex pasuje bezpośrednio w danej sytuacji związanej z przypadkowym metod bezpośrednio odwołujących się na
$!
.Uczyniło mnie to bardziej świadomym różnicy między
Nil
iAny
, a przedstawione uzasadnienie miało dla mnie więcej sensu.źródło
Nil
ustawia kontener do stanu domyślnego. Możesz zmienić wartość domyślną.my $foo is default(42) = 5;
$foo = Nil;
say $foo; # 42