gpt4 book ai didi

raku - 将所有值乘以%hash并返回具有相同结构的%hash

转载 作者:行者123 更新时间:2023-12-04 13:45:56 25 4
gpt4 key购买 nike

我在数据库列中存储了一些JSON,如下所示:

pokeapi=# SELECT height FROM pokeapi_pokedex WHERE species = 'Ninetales';
-[ RECORD 1 ]------------------------------------------
height | {"default": {"feet": "6'07\"", "meters": 2.0}}

作为“生成”算法的一部分,我正在尝试将此值放入%hash中,然后将其乘以 (0.9..1.1).rand(以允许高度自然变化10%),然后创建一个新值%hash具有相同的结构。我的 select-height方法看起来像这样:
method select-height(:$species, :$form = 'default') {
my %heights = $.data-source.get-height(:$species, :$form);

my %height = %heights * (0.9..1.1).rand;

say %height;
}

实际上,它调用了 get-height例程来获取该物种的“平均”高度(公制和英制)。
method get-height (:$species, :$form) {
my $query = dbh.prepare(qq:to/STATEMENT/);
SELECT height FROM pokeapi_pokedex WHERE species = ?;
STATEMENT

$query.execute($species);

my %height = from-json($query.row);
my %heights = self.values-or-defaults(%height, $form);

return %heights;
}

但是我在执行时遇到以下错误(我想是因为我试图将整个哈希而不是哈希的单个元素进行多重处理):
$ perl6 -I lib/ examples/height-weight.p6
{feet => 6'07", meters => 2}
Odd number of elements found where hash initializer expected:
Only saw: 1.8693857987465123e0
in method select-height at /home/kane/Projects/kawaii/p6-pokeapi/lib/Pokeapi/Pokemon/Generator.pm6 (Pokeapi::Pokemon::Generator) line 22
in block <unit> at examples/height-weight.p6 line 7

有没有一种更简单(且可行的)方式来做到这一点,而无需为每个元素重复我的代码? :)

最佳答案

首先,您的代码逻辑存在问题。最初,您会得到一个哈希值,从json中解析出"feet": "6'07\"", "meters": 2.0,其中meters是一个数字,而feet是一个字符串。接下来,您尝试将其乘以一个随机值...虽然它适用于数字,但不适用于字符串。实际上,Perl 6 allomorphs允许您执行此操作:say "5" * 3将返回15,但是X"Y'模式足够复杂,以至于Perl 6无法自然地理解它。

因此,您可能需要在处理之前进行转换,然后再进行转换。

第二件事是导致您所观察到的错误的精确行。

考虑一下:

my %a = a => 5;
%a = %a * 10 => 5; # %a becomes a hash with a single value of 10 => 5
# It happens because when a Hash is used in math ops, its size is used as a value
# Thus, if you have a single value, it'll become 1 * 10, thus 10
# And for %a = a => 1, b => 2; %a * 5 will be evaluated to 10
%a = %a * 10; # error, the key is passed, but not a value

要直接处理哈希值,您想使用 map方法并处理每一对,例如: %a .= map({ .key => .value * (0.9..1.1).rand })

当然,它可以打高尔夫球或以其他方式书写,但是主要问题可以通过这种方式解决。

关于raku - 将所有值乘以%hash并返回具有相同结构的%hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55750069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com