TL;DR绑定到 anour
是没有意义的。绑定到一个OUR::<&foo>
是有效的。我喜欢命名事物...看来您发明了一种技术,我在此将其称为“@jakar 的双重绑定our
”。
为什么直接绑定只在模块内部有效
在对他对早期 SO jnthn 的回答的评论中得出结论,我们可能会收到一条错误消息或警告,大意是:
绑定到our
变量是毫无意义的使用our
.
(他的意思是绑定只在模块内部起作用,而不是在外部,正如您所发现的那样。)
有一个古老且仍然悬而未决的问题在 BEGIN 时间绑定变量不会在运行时停留,该问题深入讨论了一般问题。
为什么动态查找在模块外工作
从以核心命名空间开头的符号总是被导出,jnthn 指出:
stashes 总是开放的,可以插入符号。
因此,忽略模块内符号的使用,您的代码正在执行以下操作:
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
优势?
人们是否想解决“绑定到our
变量毫无意义”的问题?如果是这样,他们会乐意使用@jakar 的双重绑定our
吗?
你的技术适用于所有的印记吗?(我希望如此,但将留给您探索这些方面。:))