当前位置: 首页 > 知识库问答 >
问题:

在模块中强制API边界(发行版?)水平

裴令秋
2023-03-14

我如何构造Raku代码,使某些符号在我正在编写的库中是公开的,但对库的用户不是公开的?(我说“库”是为了避免术语“分发”和“模块”,文档有时会重叠使用这两个术语。但如果我应该使用更精确的术语,请告诉我。)

我理解如何在一个文件内控制隐私。例如,我可能有一个文件foo.rakumod,其中包含以下内容:

unit module Foo;

sub private($priv) { #`[do internal stuff] }

our sub public($input) is export { #`[ code that calls &private ] }

通过此设置,&public是我的库的公共API的一部分,但&private不是--我可以在foo中调用它,但我的用户不能。

如果&private变得足够大,以至于我想把它拆分到它自己的文件中,我如何维护这种分离?如果我将&private移动到bar.rakumod中,那么我将需要为它赋予our(即包)作用域,并将它从bar模块导出,以便能够从foo使用。但这样做的方式与我从foo导出&public的方式相同,将使我的库的用户能够使用foo并调用&private-这正是我要避免的结果。如何维护&private的隐私?

(我通过将foo作为我的发行版在Meta6.json文件中提供的的一个模块列出来研究隐私的强制执行。但是从文档中,我的理解是提供的控制像zef这样的包管理器默认安装的模块,但实际上并不控制代码的隐私。这是正确的吗?)

[编辑:我得到的前几个回复让我怀疑我是否遇到了XY问题。我想我问的是“容易的事情应该是容易的”一类的事情。我要讨论的是在Rust背景下执行API边界的问题,通常的做法是在一个板条箱中公开模块(或者只公开到它们的父模块)--所以这就是我所问的X。但是如果有更好的/不同的方法在Raku中执行API边界,我也会对这个解决方案感兴趣(因为这是我真正关心的问题)]

共有2个答案

滕令雪
2023-03-14

如果您能够控制元对象协议,那么就没有什么是您不能做的。任何语法上可能的事情,原则上都可以使用一种特定的方法或类来完成,并使用该方法声明。例如,您可以有一个private-class,它只对相同名称空间的成员可见(达到您要设计的级别)。有metamodel::trusting,它定义了特定实体的信任对象(请记住,这是实现的一部分,而不是规范,因此可能会发生更改)。

可伸缩性较差的方法是使用trusts。新的私有模块需要是类的,并为每个要访问它的类发出信任X。可能包括属于同一分布的类...还是不是,那由你来决定。正是上面那个元模型类提供了这个特性,所以直接使用它可能会给您更高的控制级别(编程级别较低)

慕容兴贤
2023-03-14

我将需要给它我们的(即,包)范围,并从Bar模块导出它

第一步不是必须的。export机制同样适用于词法范围的subs,这意味着它们仅可用于导入它们的模块。由于没有隐式重新导出,模块用户必须显式地使用包含实现细节的模块才能使其到达。(顺便说一下,就我个人而言,我几乎从不在模块中使用our作用域的SUB,而完全依赖于导出。不过,我知道为什么有人会决定让它们以完全限定的名称可用。)

还可以对内部内容使用导出标记(是export(:internal),然后使用my::module::internals:internals)向模块用户提供一个更强的提示,说明他们正在取消保修。在一天结束时,不管语言提供了什么,有足够决心重用内部组件的人会找到一种方法(即使是从您的模块复制粘贴)。Raku的设计通常更注重于让人们做正确的事情变得容易,而不是让人们在真正想做的事情上变得不可能“出错”,因为有时出错的事情比其他选择的错误更小。“Raku”的设计通常更注重于让人们做正确的事情变得容易,而不是让人们做错误的事情变得容易,而不是让人们做错误的事情变得容易。

 类似资料:
  • 在php 5.1中, 扩展之间的内部依赖是可以强制性的. 由于扩展可以静态构建到php中, 也可以构建为共享对象动态加载, 因此强制依赖需要在两个地方实现. 配置时模块依赖 第一个位置是你在本章课程中刚刚看到的config.m4文件中. 你可以使用PHP_ADD_EXTENSION_DEP(extname, depname[ , optional])宏标识extname这个扩展依赖于depname

  • 下面是我使用的代码: 有办法让它起作用吗?在中似乎没有简单的方法来获取多边形的边界。

  • 问题内容: 我的雇主有一个专用模块1,我们用于内部单元/系统测试;但是,该模块的作者不再在这里工作,并且要求我使用它来测试某些设备。 问题在于,该版本需要(v8.2.0)的较旧版本,并且需要导入33个不同的文件中。我试过在v11.0.0下运行单元测试,甚至看不到TCP SYN数据包2。不幸的是,我已经在我的实验室linux服务器上安装了Twisted v11.0.0 ,并且我有依赖于它的代码。 我

  • 边缘触发是指每当状态变化时发生一个 io 事件,条件触发是只要满足条件就发生一个 io 事件

  • 问题内容: 我在另一个div内有一个div。 和。 具有弯曲的边框和白色背景。 没有弯曲的边框和绿色背景。 延伸到弧形边界之外。反正有阻止这个的吗? 无论我怎么尝试,它仍然重叠。如何服从并填充的边界? 编辑 以下hack达到了目的。但是问题 仍然存在 (也许对CSS3和Webbrowser作家而言): 为什么子元素不服从父元素的弯曲边界, 反而 有强迫它们的作用? 为了满足我现在的需要,您可以为各