rakuでの:existsによる予期しないFAIL


8

プログラムコードをデバッグしようとしたときに、次のことが発生しました。

(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
>

まとめると、問題は、%whatever:existsが機能するように、一致オブジェクトから文字列にどのように移行するかです。「キーの要素」は回避策を提供しますが、それはキーの存在を確認する正しい方法ではないと思いますか?

回答:


6

Str〜を使用してコンテキスト内に一致を配置しますが、問題は<>、変数にリテラルの引用符を使用していることです。%h<$n>リテラルキー$ nに対応する値を返します。のコンテンツに対応する値を取得するには、%h {$ n}を使用する必要があります$n。また、$ nにaが含まれてMatchいる場合、それはStrコンテキストに置かれるため、機能するはずです。


一つになりました!答えが与えられた質問を知らなかったことをお詫びします:)私は公式文書からコピーしていたとしか言えません。たぶん、私がさらに数回読んだ場合、私はそれを得たでしょう。十分な例がないことは問題
でした

謝罪は求められず、必要もありませんでした。私たちがお手伝いします。また、ドキュメンテーションの混乱しやすいコメントに感謝する場合は、問題を提起してください。ありがとう!
jjmerelo

7

<a b c>のショートカットですqw<a b c>
最終的には'a', 'b', 'c'

キーでハッシュにアクセスする方法は {}

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

次のように書く方がいいでしょう:

%h{<a b c>}

さらに良いのは、 {}

%h<a b c>

それが、それが有効なRaku構文である理由です。

だからこれを書くとき:

%h<$n>

基本的には次と同じです。

%h{'$n'}

アクセスしている要素が1つだけで、空白がない場合。
これを常に行うのではなく、

%h{'abc'}

使用する方がはるかに簡単です:

%h<abc>

そのため、すべてのドキュメントでこのフォームを使用しています。


同様に、これらも同じです。

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

ですから、$<abc>実際には$/、キーに関連付けられた値を内部で調べていますabc

Rakuには多くの構文の再利用があります。<>そのようなケースの1つです。


注意:

.keysハッシュを使用する必要はありません

'B'    %h;   # True

(楽は操作ごとに異なる演算子を使用するため、そのようなデータのマッサージを行う必要があることはまれです。)


あなたの答えは状況をうまく明らかにします-ありがとう!
hsmyers
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.