【问题标题】:unbless implementation in Perl?在 Perl 中无法实现?
【发布时间】:2015-11-08 19:43:08
【问题描述】:

正如许多 Perl 开发人员所知,unbless 用于从对象中删除 blessing
我试图通过调查其实施来了解它在内部是如何工作的。
我尝试在其包Data::Structure::Util 中检查its implementation。这是Source

sub unbless {
    unbless_xs( $_[0] );
}

我在哪里可以找到unbless_xs 子实现/源代码?

【问题讨论】:

  • 我从事 Perl 开发已有 20 年了,从未听说过 unbless...
  • 将 'any' 更改为 'many' :) ... 那么你如何取消对象呢?
  • “任何 Perl 开发者都知道,unbless 用于从对象中移除祝福” 不是。unbless 是由 @ 导出的函数987654330@。它不是核心模块,我从未见过它使用过。如果您需要unbless 一个对象,那么您的设计是可怕的。你想做什么?
  • 为这些具有TO_JSON 方法的对象编写一个角色。即使您无法控制对象最初是如何创建的,也最好将它们重新分配到提供附加功能的子类中,而不是取消它们并开始到处泄漏。
  • unblessing 对象是糟糕设计的一个原因是,它故意破坏了对象提供的封装,并暴露了依赖于对象实现细节的代码。相反,通过对对象进行子类化并提供 TO_JSON 方法,您可以保持封装到位,并简单地添加外部代码所需的行为。它将内部保持在应有的位置,并使外部代码不依赖于特定对象的内部特征。如果您不能将对象作为子类新建,请编写具有 rebless 能力的子类。

标签: perl bless


【解决方案1】:

如果您查找Data::Structure::Util on metacpan.org,您将在左侧看到一个Browse 链接,您可以通过该链接探索分发的内容

这同样适用于任何 CPAN 模块:无需下载即可检查源代码。在这种情况下,您将在结构的根目录中找到 Util.xs

如果您愿意,您可以在 CPAN 站点 search.cpan.org 上执行相同操作,但您必须升级到(当前)Data-Structure-Util-0.16 分发版才能找到浏览链接

【讨论】:

    【解决方案2】:

    它是用C实现的,你可以在https://metacpan.org/source/ANDYA/Data-Structure-Util-0.16/Util.xs#L239查看函数的来源

    【讨论】:

    • 是的,我正在寻找这个,非常感谢。我会在 10 分钟内将其标记为答案
    • 这是_unbless的来源。 _unbless_xs 是从第 858 行的指令生成的。_unbless_xs 确实调用了 _unbless,尽管 (_unbless(sv, (HV*) sv_2mortal((SV*) newHV()));)
    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2019-03-24
    • 2011-01-02
    • 2019-06-04
    • 2011-03-26
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多