gpt4 book ai didi

module - Raku 如何决定加载哪个版本的模块?

转载 作者:行者123 更新时间:2023-12-02 03:38:58 25 4
gpt4 key购买 nike

当我这样做时use Foo:ver<1.0>;它加载模块 Foo 的 1.0 版本。但是当我这样做时会发生什么use Foo;

最佳答案

TL;DR:如果没有指定特定版本,默认的 Raku 安装将从第一个 CompUnit::Repository 加载最新版本。它遇到与该模块的任何版本匹配的版本(不一定是所有 CompUnit::Repository 中的最高版本)。

<小时/>

可以创建并加载非核心 CompUnit::Repository除非另有说明,否则它本身只会加载模块的随机版本。这个答案不适用于这些,将重点讨论各种核心如何CompUnit::Repository行为并被指定。

首先确定要加载哪个模块是哪个 CompUnit::Repository首先匹配请求的身份。默认存储库链将如下所示:

# EXAMPLE 1

$ raku -e '.say for $*REPO.repo-chain'
inst#/home/ugexe/.raku
inst#/home/ugexe/raku/install/share/perl6/site
inst#/home/ugexe/raku/install/share/perl6/vendor
inst#/home/ugexe/raku/install/share/perl6

inst#前缀告诉我们这是 CompUnit::Repository::Installation 。这是相关的,因为这样的存储库可以包含多个发行版 - 包括同一发行版的多个版本 - 这对于单一发行版 CompUnit::Repository::FileSystem 来说是不正确的。用于-I.-Ilib (实际上是 -Ifile#/home/ugexe/repos/Foo-Ifile#/home/ugexe/repos/Foo/lib )。

# EXAMPLE 2

$ raku -I. -e '.say for $*REPO.repo-chain'
file#/home/ugexe/repos/Foo
inst#/home/ugexe/.raku
inst#/home/ugexe/raku/install/share/perl6/site
inst#/home/ugexe/raku/install/share/perl6/vendor
inst#/home/ugexe/raku/install/share/perl6

让我们假设以下情况:

  • file#/home/ugexe/repos/Foo包含Foo:ver<0.5>

  • inst#/home/ugexe/.raku包含Foo:ver<0.1>Foo:ver<1.0>

  • inst#/home/ugexe/.raku包含Foo:ver<2.0>Foo:ver<0.1>

use Foo;将加载:

  • 示例 1 - Foo:ver<1.0>来自inst#/home/ugexe/.raku

  • 示例 2 - Foo:ver<0.5>来自file#/home/ugexe/repos/Foo

尽管所有存储库中的最高版本是 Foo:ver<2.0>链中第一个与 Foo 版本(即 use Foo )匹配的存储库获胜,因此 Foo:ver<2.0>从未被选择。您可能会猜测这使得“最高版本”成为决定加载模块版本的第二件事,但它实际上是第四件事!不过我在这里提到它是因为对于典型用法来说这已经足够了。

<小时/>

决定加载模块版本的第二件事是 api field 。这本质上是另一个版本字段,当与版本本身结合时,它提供了固定主要版本的基本方法。

让我们假设以下情况:

  • file#/home/ugexe/repos/Foo包含Foo:api<0>:ver<0.5>

  • inst#/home/ugexe/.raku包含Foo:api<1>:ver<0.1>Foo:api<0>:ver<1.0>

use Foo;将加载:

  • 示例 1 - Foo:api<1>:ver<0.1>来自inst#/home/ugexe/.raku

  • 示例 2 - Foo:api<0>:ver<0.5>来自file#/home/ugexe/repos/Foo

尽管示例 1 中的最高版本是 Foo:api<0>:ver<1.0> ,最高api版本为Foo:api<1>:ver<0.1>因此被选择。

<小时/>

决定加载模块版本的第三件事是 auth field 。不像 apiver它并不意味着任何排序。也不像 apiver您可能不应该在您的例如领域中使用它use Foo -- 它以政策为中心,并将成为大多数开发人员永远不必担心(ab)使用的强大工具/逃生舱口。

让我们假设以下情况:

  • file#/home/ugexe/repos/Foo包含Foo:auth<github:ugexe>:ver<0.5>

  • inst#/home/ugexe/.raku包含Foo:ver<0.1>Foo:auth<github:ugexe>:ver<1.0>

use Foo;将加载:

  • 示例 1 - Foo:auth<github:ugexe>:ver<1.0>来自inst#/home/ugexe/.raku

  • 示例 2 - Foo:auth<github:ugexe>:ver<0.5>来自file#/home/ugexe/repos/Foo

在两个示例中 use Foo;use Foo:auth(*):ver(*) 相同,所以即使存储库假设之一包含一个没有 auth 的模块这并不意味着它与 use Foo; 完全匹配。相反,:auth(*)包括任何auth值作为匹配项(实际上意味着 auth 被完全忽略)。

<小时/>

有关更多示例,spec tests是一个很好的来源

关于module - Raku 如何决定加载哪个版本的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55671684/

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