为什么直接绑定 "our &foo "不能用,而通过动态查找间接绑定就可以?

问题描述 投票:2回答:1

为什么在模块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时出现错误,因为r2是在模块TEST之外定义的。

module raku subroutine rakudo
1个回答
5
投票

TL;DR 绑定到一个 our 是毫无意义的。绑定到一个 OUR::<&foo> 是有效的。我喜欢给东西起名字... 看来你发明了一种技术 我在此称其为"@Jakar的双重束缚 our".

为什么直接绑定只能在模块内使用

在对他的回答的评论中 早期 jnthn的结论是,我们也许可以有一个错误信息,或者说是一个警告,大意是。

绑定到一个 our 变量是毫无意义的使用 our.

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

有一个老问题,现在还没有解决 在BEGIN时绑定一个变量,不会在运行时停留。 中深入讨论了一般问题。

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

来自 以核心命名空间开头的符号总是会被导出。,jnthn指出,。

储藏室永远是开放的,可以把符号捅进去。

所以,忽略符号的使用 里面 你的模块,你的代码是这样做的。

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?

  • 你的技术是否适用于所有的符咒?(我希望如此,但会让你去探索这些方面。:))

© www.soinside.com 2019 - 2024. All rights reserved.