gpt4 book ai didi

arrays - 从一个范围声明并初始化一个类型化数组

转载 作者:行者123 更新时间:2023-12-02 07:37:30 25 4
gpt4 key购买 nike

我最近试过 my Array @a = 'a'..'z';my Array @a = @('a'..'z'); .

两者都会产生以下错误:

Type check failed in assignment to @a; expected Array but got Str ("a")
in block <unit> at <unknown file> line 1

然而,在没有类型的情况下进行初始化工作,似乎最终会产生一个数组:
> my @a = 'a'..'z';
> @a.^name
Array

为什么会这样?

最佳答案

TL;博士 我在中提供了一个相对简单的答案为什么会这样? 但是,这种解释可能不够充分1,因此我在 中查看了一些替代方案。从一个范围声明并初始化一个类型化数组。

Why is this the case?


  • my @a;声明一个新的 Array (初始化为空)并将其“绑定(bind)”到符号 @a .因此my @a; say @a.^name返回 Array .没必要用Array这个词在数组的声明或初始化中——@ 2
  • 就够了。
  • my @a = 'a'..'z'尝试复制范围 'a' 中的每个值直通 'z' ,一次一个,进入 @a[0] , @a[1]等。新数组绑定(bind)到 @a每个元素都有一个类型约束(在下一节中解释);它将针对每个值进行检查(并且会成功)。
  • my Array @a声明一个 ArrayArray对其元素的类型约束(所以它是一个数组数组)。 my Array @a; say @a.^name返回 Array[Array]来表明这一点。 my Array @a = 'a'..'z';复制第一个值(“a”)时失败,因为它是 Str值不是 Array .

  • Declare and initialize a typed array from a range


    my @a = 'a'..'z';
    my @a此语句的一部分声明了一个变量,该变量绑定(bind)到(引用)类型为 Array 的新数组。 .因为没有指定元素类型约束,所以新数组的元素被约束为与 Mu 一致, u P6 中的 nassuming 类型。换句话说,它是一个空数组,准备好包含您想要放入其中的任何值。 (可以说 say @a.^name 显示 Array 而不是 Array[Mu] 因为 [Mu] 被认为是 M ost 56 ninteresting.
    ... = 'a'..'z'初始化新数组。初始化对数组已经建立的类型约束没有影响。它只提供字符串的副本 'a' , 'b'等进入数组(自动扩展以接收它们到 @a[0]@a[1] 等)。

    我建议开发人员避免在变量上添加显式类型约束和值的显式强制,除非他们确信它们是可取的。 (参见我在 an earlier SO answer 末尾的括号注释。)也就是说,您可以选择这样做:
    my Str @a = 'a'..'z';      # `Array` elements constrained to `Str`
    my Str @a = (0..99)>>.Str; # Coerce value to match constraint

    或者,P6 支持显式 装订 , 而不是 作业 , 一个值或值列表。最常见的方法是使用 :=而不是 = :
    my @a := 'a'..'z'; say @a.WHAT; say @a[25]; # (Range)␤z

    注意 @a 的显式绑定(bind)是如何进行的意味着 @a未绑定(bind)新Array而是到 Range值(value)。因为一个 Range可以表现为 Positional ,位置下标仍然有效。

    以下语句将是非常多余的显式类型,但它们都可以工作并产生彼此完全相同的结果,尽管第一个会更快:
    my Str @a := Array[Str].new('a'..'z'); 
    my Str @a = Array[Str].new('a'..'z');

    关于这个主题还有更多要讨论的内容,但也许上述内容足以解决这个问题/答案。如果没有,请在原始问题下方和/或下方的评论中提出更多问题。

    脚注

    1 这个答案的早期版本开始于:
    my Array @a ...
    # My array of thoughts raised by this declaration
    # and your questing "why?" in this SO question
    # began with wry thoughts about complicated answers
    # about reasons your array is awry and pedances

    (我编造了“pedances”这个词来表示一些看似迂腐但正确使用时流畅的东西——一旦你熟悉了它看似独特但实际上很有帮助的性质,这就会自然发生。更重要的是,我需要一些东西与“答案”押韵。)

    2 这里有几个关于@ 含义的助记符。在 P6:
  • 它看起来像一个零位( 0 )和一个 𝑎 ( Mathematical Italic Small A )在里面——还有一个 @foo变量默认为 0索引 𝑎𝑟𝑟𝑎𝑦 (或 @𝑟𝑟𝑎𝑦)。
  • 听起来像“在”这个词。数组在索引处有元素。
  • 关于arrays - 从一个范围声明并初始化一个类型化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56161140/

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