gpt4 book ai didi

arrays - 如何指定返回的数组类型?

转载 作者:行者123 更新时间:2023-12-04 11:24:28 24 4
gpt4 key购买 nike

sub a { my @c = 1, 2, 3, 4;     return @c };
sub b { my $d = [ 1, 2, 3, 4 ]; return $d };

say a().WHAT; # (Array)
say b().WHAT; # (Array)

my @e = a();
my @f = b();

say @e; # [1 2 3 4]
say @e[1]; # 2

say @f; # [[1 2 3 4]]
say @f[1]; # (Any)

# valid raku code, no errors messages
这些子例程都返回一个数组,但返回的数组行为不同。在文档中明确子例程返回哪种数组类型的正确表达式是什么?
sub b ( --> Array ) { my $d = [ 1, 2, 3, 4 ]; return $d };
say b().WHAT; # (Array)
sub b ( --> Scalar ) { my $d = [ 1, 2, 3, 4 ]; return $d };
say b().WHAT;

# Type check failed for return value; expected Scalar but got Array ([1, 2, 3, 4])
# in sub b at ...
# in block <unit> at ...

最佳答案

这是关于 Scalar 还没有拆箱。return $d ---> return @$d获得相同行为的第一个机会是更改 b常规。
您已经写过“这些子例程都返回一个数组,但返回的数组行为不同。”。但是,正如 Holli 所说,b而是返回 Scalar绑定(bind)到 $d (这又包含一个数组):

sub b { my $d = [ 1, 2, 3, 4 ]; return $d };
say b().VAR.WHAT; # (Scalar)
您可以通过“拆箱”来改变它 $d ,例如通过前置 @ :
sub b { my $d = [ 1, 2, 3, 4 ]; return @$d };
say b().VAR.WHAT; # (Array)

my @f = b();

say @f; # [1 2 3 4]
say @f[1]; # 2
@f = b() ---> @f = b[]如果你不去容器化 b 返回的值,然后出现第二个问题/机会。
不管怎样 b返回, @f assignment 将评估分配给它的值列表。在列表上下文中, Scalar s 保持原样(就像它们使用普通的 return $d 一样)。所以如果你不改 b要解除容器化,那么您需要在分配给 @f 时这样做相反,如果你想要 @e@f以同样的方式结束。
这次你不能只是在前面加上 @这样做。因为那会拼写 @b -- Raku 将其解释为 @b多变的。
一种选择是写 @f = @(b()) ,但这会很丑/不习惯。另一种选择是写 @f = b[] .这利用了 b 中的括号这一事实。电话是多余的。附加 [] (“禅宗切片”)与写作 @(b) 的效果相同,但少了一个字符。
因此,要在列表分配中解容器,您可以编写:
sub b { my $d = [ 1, 2, 3, 4 ]; return $d };
say b().VAR.WHAT; # (Scalar)

my @f = b[];

say @f; # [1 2 3 4]
say @f[1]; # 2
“在文档中说清楚”

What would be the correct expression to make clear in the documentation which array type what is returned by the subroutine?


我不确定您的这个问题是什么意思,即使切换到“返回的内容”也是如此。
我也不确定要在文档中指点什么,即使有任何好的地方可以指点你,相对于你的 SO 中的场景。
我确实知道,如果是我,我会发现以下文档部分与您的场景相比令人困惑:
  • Scalar containers and listy things节霍利联系。在我看来,该部分目前是关于 Scalar 的使用。列表/数组中的容器,这与我上面写的第二个问题有关( $d 位于对 @f 的赋值的列表中)。但这与我写的第一个问题无关(return $d 来自 b 例程)。事情正好相反,即在 Scalar 中有一个数组。 .
  • Scalar containers同一页上较早的部分。开场白——“尽管 Scalar 类型的对象在 Raku 中随处可见,但你很少直接将它们视为对象,因为大多数操作都将...解容器”对我有用。但是“如果标记为 is rw,例程可以返回容器”问题更大。是真的:
  • my $x = 23;
    sub f() is rw { $x };
    f() = 42;
    say $x; # OUTPUT: «42␤»
    但不必标记例程 is rw返回一个容器。可以使用 return例行公事,就像你一样:
    my $x = 23;
    sub f() { return $x };
    say f().VAR.WHAT; # OUTPUT: «Scalar␤»

    关于arrays - 如何指定返回的数组类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68703347/

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