JJA:
APIのJSONメッセージを作成しようとしたとき、私は自分自身が、私は簡単なことだろうと思ったことを何かをするのに苦労しました。私は、次のようなメッセージを作成するために必要な:
{ "list": [ { "foo": 1, "bar": 2 } ] }
しかし、私の最初の試みは動作しませんでした。
say to-json { foo => [ { a => 1, b => 2 } ] };
# {"foo":[{"a":1},{"b":2}]}
さらに物事を単純化しようとすると、より多くの私を混同しました:
say { foo => [ { a => 1 } ] };
# {foo => [a => 1]}
# Note that this is not JSON, but I expected to see curly braces
そして、私はいくつかの一時的な変数を使用することを試みたが、それが働きました:
my @list = { a => 1 };
say to-json { foo => @list };
# {"foo":[{"a":1}]}
my %hash = ( a => 1 );
say to-json { foo => [ %hash ] };
# {"foo":[{"a":1}]}
何が起きてる?
そして、私は、余分な一時変数なしで私の所望の出力を達成することができます方法はありますか?
ジョナサン・ワージントン:
あなたは発見した単一の引数ルールを。楽で多数の構築物は、彼らが提供している引数を反復します。これには、[...]
配列の作曲を。私たちが言う時には、このためです。
say [1..10];
私たちは10個の要素を含む配列ではなく、1。しかし、それはまたことを意味します:
say [[1,2]];
反復[1,2]
、したがって、その結果[1,2]
、内側アレイがなかったかのように- 。Hash
したがって、そのペアを反復処理します:
{ foo => [ { a => 1, b => 2 } ] }
実際に生成します。
{ foo => [ a => 1, b => 2 ] }
つまり、配列がペアを持っています。JSONシリアライザは、1つの要素を対象として各ペアをシリアル化します。
溶液は、単一要素反復可能に製造することです。中置,
演算子は、我々はそれを使用することができますので、リストを生成するものです。
say to-json { foo => [ { a => 1, b => 2 }, ] };
# note the , here ^
そして、反復される単一の引数はハッシュと1要素のリストで、あなたが望む結果を得ます。
あなたが実際にそれを埋めるために、そこから単一のiterableを指定している場合を除き、常に、1つも要素のリストで、リスト、配列やハッシュの値を指定する場合はカンマを末尾に使用します。それを覚えて簡単な方法。