Ich habe in letzter Zeit viel Zeit damit verbracht, ein Skript zu debuggen, und als ich schließlich das Problem fand, lag es an Code, der so aussah:
class Foo {
has $.bar;
method () {
# do stuff
$!.bar;
}
}
Es stellte sich heraus, dass das Problem damit bestand $!.bar
, was entweder $!bar
oder sein sollte $.bar
. Ich verstehe das.
Aber warum stirbt das nicht ?
Mit Blick auf diese im Detail, es sieht aus wie das Problem hier ist , dass ich versuche , eine (nicht vorhanden) Methode aufrufen bar
auf $!
, die an dieser Stelle ist , Nil
weil es irgendwelche Fehler nicht gewesen sein.
Und es sieht so aus, als könnte ich tatsächlich jede Methode aufrufen, die ich möchte, Nil
und alle kehren lautlos zurück Nil
, einschließlich Sachen wie Nil.this-is-a-fake-method
und Nil.reverse-entropy(123)
.
Ist das eine Funktion? Wenn ja, was ist der Grund?
Nil
RückgabeNil
, sodassNil
Methodenaufrufketten nach unten weitergegeben werden." Es ist also beabsichtigt, dass Sie$foo.Bar().Baz().Blah()
bei jedem Schritt keine Nulltests oder eine spezielle?.
Art von Operator benötigen (solange Sie am Ende mit Null richtig umgehen). Ich werde das bearbeiten, danke.Nil
, das keine Fehler macht und nur mehrNil
zurückwirft, wird in Obj-C und den NS-Frameworks, wo es auf ähnliche Weise verwendet wird, ziemlich umfangreich verwendet - ermöglicht verkettete Anrufe, die weiterhin Nil weiterleiten. Ich kenne die genauen Leistungseinbußen von Ausnahmen und deren Erfassung nicht, aber ich vermute, dass dieNil
Verkettung effizienter, wenn auch weniger flexibel sein kann.Nil
Klasse verfügt über eine MethodeFALLBACK
docs.raku.org/language/typesystem#index-entry-FALLBACK_(method) , die zurückgegeben wirdNil
. Grundsätzlich wird kurz bevor eine Ausnahme ausgelöst wird, weil eine Methode nicht gefunden werden konnte, eine ÜberprüfungFALLBACK
durchgeführt und aufgerufen, falls verfügbar.Diese Frage (und die Antwort von Hobbs) hat mich auch ... unruhig gemacht: Ich habe schließlich https://docs.raku.org/language/traps gefunden : Es erklärt, dass das Zuweisen
Nil
normalerweise einen anderen Wert erzeugtAny
. Die folgende grundlegende REPL-Interaktion zeigt dies ebenfalls:((Der Unterschied zwischen
=
und:=
wird hier behandelt: https://docs.raku.org/language/containers#Binding ))... also ist die allgemeine Idee, dass der "fehlende Wert oder gutartige Fehler" im regulären Code weit weniger verbreitet ist, als ich (und vielleicht auch Sie?) plötzlich befürchtet habe: Es tritt jedoch auf, wenn Sie mit Regex arbeiten stimmt direkt und in Ihrer speziellen zufälligen Situation mit dem direkten Aufrufen von Methoden überein
$!
.Dies machte mich bewusster über den Unterschied zwischen
Nil
undAny
und die bereitgestellte Begründung machte für mich mehr Sinn.quelle
Nil
Setzt einen Container auf seinen Standardzustand. Sie können den Standardwert ändern.my $foo is default(42) = 5;
$foo = Nil;
say $foo; # 42