Использование «по умолчанию» с хэшем массивов

Вот рабочий пример:

my %hash;
for 1..4 -> $i {
    %hash{$i} = Array.new without %hash{$i};
    %hash{$i}.push: $_ for ^$i;
}
say %hash; # OUTPUT: {1 => [0], 2 => [0 1], 3 => [0 1 2], 4 => [0 1 2 3]}

Но почему следующий подобный пример не работает?

my %hash is default(Array.new);
for 1..4 -> $i {
    %hash{$i}.push: $_ for ^$i;
}
say %hash; # OUTPUT: {}

Это меня еще больше смущает, потому что следующий пример работает как положено:

my %hash is default(42);
for 1..4 -> $i {
    %hash{$i}.=Str;
}
say %hash.raku; # OUTPUT: {"1" => "42", "2" => "42", "3" => "42", "4" => "42"}

Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
9
0
170
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне не сразу понятно, почему результатом второго примера является пустой хэш, однако использование is default таким образом не будет работать так, как вы хотите. Трейты применяются во время компиляции; таким образом, is default(Array.new), даже если бы он работал правильно, создал бы один экземпляр Array во время компиляции и повторно использовал бы его глобально. Итак, результат, который я ожидаю, будет примерно таким:

1 => [0 0 1 0 1 2 0 1 2 3], 2 => [0 0 1 0 1 2 0 1 2 3], 3 => [0 0 1 0 1 2 0 1 2 3], 4 => [0 0 1 0 1 2 0 1 2 3]}

То, что это не дает, это, вероятно, ошибка.

Однако благодаря автоживификации первый пример можно сократить до:

my %hash;
for 1..4 -> $i {
    %hash{$i}.push: $_ for ^$i;
}
say %hash; # {1 => [0], 2 => [0 1], 3 => [0 1 2], 4 => [0 1 2 3]}

В любом случае массив создается автоматически при выполнении операции с массивом над неопределенным значением, что означает, что в такой ситуации нет смысла использовать is default.

Я думаю, в RakuAST мы могли бы довольно легко рассматривать содержимое is default() как преобразователь и сгенерировать его для запуска во время выполнения с помощью специального дескриптора контейнера? У меня были случаи, когда я хотел принудительно указать значения хеша, например. быть родным массивом str, и это было бы удобно для этого.

Elizabeth Mattijsen 18.02.2023 16:34

Я не думаю, что RakuAST сам по себе что-то меняет. Черты реализованы как множественная отправка, выполняемая во время компиляции, поэтому к тому времени, когда мы достигнем обработчика признаков, мы уже получим значение, а не AST. Я действительно не понимаю, зачем нужен особый случай is default, когда уже есть черта will, которая идет с блоком, поэтому will default { ... } не нужен особый случай.

Jonathan Worthington 18.02.2023 23:25

Другие вопросы по теме