gpt4 book ai didi

module - 为什么直接绑定(bind) `our &foo` 不起作用,但通过动态查找间接绑定(bind)?

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

为什么在模块 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 绑定(bind)到 our是没有意义的。绑定(bind)到 OUR::<&foo>是有效的。我喜欢给事物命名……看来你发明了一种技术,我特此称之为“@jakar 的双重绑定(bind) our”。

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

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

binding to an our variable is pointless use of our.



(他的意思是绑定(bind)只在模块内部起作用,而不是在外部,正如您所发现的那样。)

有一个老问题 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.



因此,忽略模块内符号的使用,您的代码正在执行以下操作:
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 的双重绑定(bind) our
如果一个人希望能够声明一个符号并在模块内部和外部使用它并坚持使用绑定(bind),那么使用双重绑定(bind)声明它的技巧可能是最好的技术:
    our &r1 := OUR::{'&r1'} := sub { ... }
^^^^^^^^^^^^^^^^^^^^^^^^^^^ works *outside* module
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ works *inside* module

我很好奇的一些事情:
  • 您是否能够确认可以从绑定(bind)而不是分配 our 中获得的任何重要的具体和实际优势? ?
  • 人们是否想解决“绑定(bind)到 our 变量毫无意义”的问题?如果是这样,他们会乐意使用@jakar 的双重绑定(bind)our吗? ?
  • 你的技术适用于所有的印记吗? (我希望如此,但将留给您探索这些方面。:))
  • 关于module - 为什么直接绑定(bind) `our &foo` 不起作用,但通过动态查找间接绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62236426/

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