Unerwarteter Fehler mit: existiert in Raku

8

Beim Versuch, Programmcode zu debuggen, stieß ich auf Folgendes:

(base) hsmyers@BigIron:~$ rlwrap -A raku

To exit type 'exit' or '^D'
> my regex N { <[A..G]> };
regex N { <[A..G]> }
> my %h = A => 1, B => 2;
{A => 1, B => 2}
> 'B' ∈ %h.keys
True
> my $m = 'B' ~~ / <N> /;
「B」
 N => 「B」
> $m ∈ %h.keys
False
> $m.Str ∈ %h.keys
True
> my $n = $m.Str
B
> $n ∈ %h.keys
True
> %h<B>:exists
True
> %h<$n>:exists
False
>

Zusammenfassend stellt sich die Frage, wie Sie vom Übereinstimmungsobjekt zum String wechseln, sodass% Whatever: exist funktioniert. 'Element of Keys' bietet eine Problemumgehung, aber ich glaube, dass dies nicht der richtige Weg ist, um die Existenz von Schlüsseln zu überprüfen?

hsmyers
quelle

Antworten:

6

Sie setzen Übereinstimmungen Strmit ~ in einen Kontext, aber ich denke, das Problem ist, dass Sie wörtliche Anführungszeichen <>für eine Variable verwenden. %h<$n>Gibt den Wert zurück, der dem Literalschlüssel $ n entspricht. Sie müssen% h {$ n} verwenden, um den Wert abzurufen, der dem Inhalt von entspricht $n. Wenn $ n ein enthält Match, wird es in den Str-Kontext gestellt, sodass dies funktionieren sollte.

jjmerelo
quelle
Habe es in einem! Ich entschuldige mich für die Unkenntnis der Frage angesichts der Antwort :) Ich kann nur sagen, dass ich aus der offiziellen Dokumentation kopiert habe. Wenn ich es noch mehrmals gelesen hätte, hätte ich es vielleicht bekommen. Das Fehlen ausreichender Beispiele war ein Problem…
hsmyers
Keine Entschuldigung gefragt, keine nötig. Wir sind hier um zu helfen. Und wenn Sie einige verwirrende Bemerkungen in der Dokumentation zu schätzen wissen, werfen Sie bitte ein Problem auf. Vielen Dank!
Jjmerelo
7

<a b c>ist eine Abkürzung für qw<a b c>.
Welches wird als enden'a', 'b', 'c'

Der Zugriff auf einen Hash per Schlüssel erfolgt mit {}

%h{'a', 'b', 'c'}

Welches wäre schöner zu schreiben als:

%h{<a b c>}

Was noch schöner wäre, ist das loszuwerden {}

%h<a b c>

Deshalb ist das eine gültige Raku-Syntax.

Also, wenn Sie dies schreiben:

%h<$n>

Es ist im Grunde das gleiche wie:

%h{'$n'}

Wenn Sie nur auf ein Element zugreifen und es kein Leerzeichen hat.
Anstatt dies die ganze Zeit zu tun:

%h{'abc'}

Es ist viel einfacher, nur zu verwenden:

%h<abc>

Aus diesem Grund wird in der gesamten Dokumentation dieses Formular verwendet.


Ebenso sind diese auch gleich:

$/{<a b c>}
$/<a b c>
$<a b c>

Wenn Sie also sehen, dass $<abc>es wirklich nach $/dem Wert sucht, der dem Schlüssel zugeordnet ist abc.

In Raku wird viel Syntax wiederverwendet. <>ist ein solcher Fall.


Hinweis:

Sie müssen nicht .keysauf einem Hash mit verwenden .

'B'    %h;   # True

(Da Raku unterschiedliche Operatoren für unterschiedliche Operationen verwendet, ist es selten, dass Sie eine solche Datenmassage durchführen müssen.)

Brad Gilbert
quelle
Ihre Antwort klärt die Situation gut - danke!
Hsmyers