Khó khăn khi xây dựng cấu trúc dữ liệu lồng nhau


14

Trong khi cố gắng tạo một thông báo JSON cho API, tôi thấy mình phải vật lộn để làm điều gì đó mà tôi nghĩ sẽ đơn giản. Tôi cần tạo một tin nhắn như sau:

{ "list": [ { "foo": 1, "bar": 2 } ] }

Tuy nhiên, nỗ lực đầu tiên của tôi đã không hoạt động:

say to-json { foo => [ { a => 1, b => 2 } ] };
# {"foo":[{"a":1},{"b":2}]}

Cố gắng đơn giản hóa mọi thứ càng làm tôi bối rối hơn:

say { foo => [ { a => 1 } ] };
# {foo => [a => 1]}
# Note that this is not JSON, but I expected to see curly braces

Sau đó, tôi đã cố gắng sử dụng một số biến tạm thời và điều đó đã làm việc:

my @list = { a => 1 };
say to-json { foo => @list };
# {"foo":[{"a":1}]}

my %hash = ( a => 1 );
say to-json { foo => [ %hash ] };
# {"foo":[{"a":1}]}

Những gì đang xảy ra ở đây?

Và có cách nào để tôi có thể đạt được đầu ra mong muốn của mình mà không cần thêm một biến tạm thời không?


1
say to-json { foo => [ { a => 1 } ] };nên xuất cái gì đó như thế {"foo":[{"a":1}]}, không {"foo":["a":1]}. Cái sau là một lỗi đánh máy, phải không? Nếu không, say $*PERL.compiler.version;nói gì?
raiph

Hừm, đúng rồi. Tôi đoán tôi đã đọc sai mọi thứ khi tôi đang thử mọi thứ. Ngay cả say to-json { foo => [ a => 1 ] }kết quả đầu ra {"foo":[{"a":1}]}để ai biết tôi đã gõ gì khi tôi nhận được điều đó, nếu tôi đã từng làm. Lỗi của tôi!
JJA

Câu trả lời:


17

Bạn đã phát hiện ra quy tắc đối số duy nhất . Nhiều cấu trúc trong Raku sẽ lặp lại đối số mà chúng được cung cấp. Điều này bao gồm các [...]nhà soạn nhạc mảng. Đây là lý do tại sao khi chúng ta nói:

say [1..10];

Chúng ta có một mảng chứa 10 phần tử, không phải 1. Tuy nhiên, điều đó cũng có nghĩa là:

say [[1,2]];

Lặp lại [1,2], và do đó dẫn đến kết quả [1,2]- như thể mảng bên trong không có ở đó. Một Hashlặp đi lặp lại cho các cặp của nó, do đó:

{ foo => [ { a => 1, b => 2 } ] }

Thực tế sản xuất:

{ foo => [ a => 1, b => 2 ] }

Đó là, mảng có các cặp. Bộ tuần tự JSON sau đó tuần tự hóa từng cặp như một đối tượng một thành phần.

Giải pháp là sản xuất một phần tử lặp duy nhất. ,Toán tử infix là thứ tạo ra các danh sách, vì vậy chúng ta có thể sử dụng:

say to-json { foo => [ { a => 1, b => 2 }, ] };
#                        note the , here ^

Sau đó, đối số duy nhất được lặp lại là danh sách 1 phần tử có hàm băm và bạn nhận được kết quả bạn muốn.

Cách dễ nhớ: luôn luôn sử dụng dấu phẩy khi chỉ định các giá trị của danh sách, mảng hoặc hàm băm, ngay cả với một danh sách thành phần duy nhất, trừ khi bạn thực sự chỉ định một lần lặp duy nhất để điền vào nó.


2
Một cách khác là chia thành từng mục trong vô hướng: {foo => [$ {a => 1, b => 2}]}
jakar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.