为什么 `our &foo` 的直接绑定不起作用,但通过动态查找间接绑定却起作用?

Why does direct binding of an `our &foo` not work, but indirecting via a dynamic lookup does?

为什么在模块 TEST 外部调用时 r1 和 r2 之间存在差异?

module TEST {
    our &r1 := OUR::{'&r1'} := sub {
        say 'routine 1'
    }

    r1();            # routine 1

    our &r2 := sub {
        say 'routine 2'
    }

    r2();            # routine 2
}

import TEST;

say TEST::.keys;     # (&r1 &r2)

TEST::r1();          # routine 1
TEST::r2();          # Cannot invoke this object (REPR: Uninstantiable; Callable) ...

在定义模块 TEST 之外尝试 运行 子例程 r2 时出错。

TL;DR 绑定到 our 是没有意义的。绑定到 OUR::<&foo> 是有效的。我喜欢给东西命名...看来你发明了一种技术,我特此将其命名为“@jakar 的双重绑定 our”。

为什么直接绑定只在模块内部有效

在对他对 的回答的评论中,jnthn 得出结论,我们可能会收到错误消息或警告,大意是:

binding to an our variable is pointless use of our.

(他的意思是绑定只在模块内部起作用,而不是在模块外部,如您所见。)

有一个老问题 Binding a variable at BEGIN time doesn't stick around for runtime 深入讨论了一般问题。

为什么动态查找在模块外工作

来自 Symbols that start with core namespaces always get exported,jnthn 指出:

stashes are always open to poke symbols in to.

所以,忽略符号的使用 inside 你的模块,你的代码是这样做的:

module TEST {
    OUR::{'&r1'} := sub { say 'routine 1' }
    our &r2;
}

import TEST;

TEST::r1();          # routine 1
TEST::r2();          # Cannot invoke this object (REPR: Uninstantiable; Callable) ...

@jakar 的双重绑定our

如果想要声明一个符号并在模块内外都使用它并坚持使用绑定那么你用双重绑定声明它的技巧可能成为可用的最佳技术:

    our &r1 := OUR::{'&r1'} := sub { ... }
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^ works *outside* module
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ works *inside* module

有些事情我很好奇:

  • 您是否能够确认任何重要的具体实用 可以通过绑定而不是分配 our?

  • 获得的优势
  • 人们想解决 "binding to an our variable is pointless" 问题吗?如果是这样,他们会很乐意使用@jakar 的双重绑定 our?

  • 你的技术适用于所有印记吗? (我希望如此,但将留给您去探索这些方面。:))