从元模型强制执行单个实例

2023-12-09

我知道从类级别确保单个实例要容易得多,而且有很好的StaticishJonathan Stowe 的模块通过使用角色来执行相同的操作,但我只是想尝试更好地理解如何阶级高阶工作可以处理,主要是针对FOSDEM的讲。我可以想到在元模型级别上执行的几种方法,但最终我想到的是:

my class MetamodelX::Singleton is Metamodel::ClassHOW {

    my \instance = Mu;

    method compose(Mu \type) {
        my &callsame := CORE::<&callsame>; # Workaround for RT #127858
        self.method_table(type)<new>.wrap: -> \SELF, | {
            unless instance.defined { instance = SELF };
            callsame();
        };
    }
}

my package EXPORTHOW {
    package DECLARE {
        constant singleton = MetamodelX::Singleton;
    }
}

主要是从OO::Monitors代码,据我所知,由 JJ Atria 和 Jonathan Worthington 编写)

主要原理是尝试包装构建子方法,或者以某种方式尝试创建对象的新实例。然而,这(以及与BUILD and BUILDALL,接近原始),失败并显示:

No such method 'wrap' for invocant of type 'Any'.  Did you mean any of
these: 'Map', 'WHAT', 'grep', 'map'?

很明显,我不明白它们的作用,或者整个如何概念。那么,你知道这里可能会失败吗,或者有任何其他方法可以在元模型级别覆盖对象的构建,以便能够按预期进行吗?


这次尝试存在一些误解。

  1. 每种类型都有一个元类实例。因此,如果我们希望允许给定类型仅实例化一次,则正确的作用域是元类中的属性,而不是my. A my意味着无论我们创建哪种类型,都有一个全局对象。
  2. The compose方法,当子类化时ClassHOW,应始终回拨至基地compose方法(可以使用callsame)。否则,班级将无法组成。
  3. The method_table方法返回此方法的方法表exact类型。然而,大多数课程都没有new方法。相反,他们将继承默认值。如果我们包裹that然而,我们将会产生非常全球性的影响。

While new重写以更改构造接口是相对常见的,bless方法 - 其中new完成任何映射工作后的调用 - 不是我们期望语言用户覆盖的东西。所以我们可以继续的一种方法是尝试安装bless执行所需逻辑的方法。 (我们也可以与new,但实际上我们需要检查此类中是否有一个,如果有则将其包装,然后添加默认副本的副本,如果没有则将其包装,这需要更多的努力。)

这是一个有效的解决方案:

my class MetamodelX::Singleton is Metamodel::ClassHOW {
    has $!instance;

    method compose(Mu \type) {
        self.add_method(type, 'bless', -> \SELF, |c {
            without $!instance {
                $!instance := SELF.Mu::bless(|c);
            }
            $!instance
        });
        callsame();
    }
}

my package EXPORTHOW {
    package DECLARE {
        constant singleton = MetamodelX::Singleton;
    }
}

请注意,我们不能使用callsame在我们添加的代码内部bless因为它实际上不是一个method。我们可以将其编写为使用anon method,但是我们有一个问题,该方法有自己的想法self,所以我们最终不得不保存元类self并安排一些其他方式来访问$!instance.

最后,举一个实际的例子:

use Singleton;

singleton Counter {
    has $.x;
    method inc() { $!x++ }
}

my $c1 = Counter.new;
$c1.inc;

my $c2 = Counter.new; # Gets same instance as in $c1
$c1.inc;
$c2.inc;

say $c1.x; # 3 
say $c2.x; # 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从元模型强制执行单个实例 的相关文章

随机推荐

  • 重复本地通知不更新内容

    我制作了一个应用程序 每天上午 9 点发送一条本地通知 向用户显示随机素数 问题是显示的数字始终相同 创建通知请求的代码仅被调用一次 这是我所期望的 因为通知是重复的 那么我如何更新其内容 我可以提供生成随机素数的代码 但我已经测试过它并且
  • 使用 Ivy Bridge 和 Haswell 循环展开以实现最大吞吐量

    我正在使用 AVX 同时计算八个点积 在我当前的代码中 我做了这样的事情 在展开之前 常春藤桥 桑迪桥 m256 areg0 mm256 set1 ps a m for int i 0 i
  • 确定字符串是否具有唯一字符

    该问题要求 实现一种算法来确定字符串是否具有所有唯一字符 我看到了解决方案 但不太明白 public boolean isUniqueChars String str if str length gt 256 return false bo
  • 如何在 R 中为 dist 函数指定其他方法?

    在 R 中 dist 函数的文档中有以下内容 method 要使用的距离测量 这必须是 euclidean maximum manhattan canberra binary 或 minkowski 之一 可以给出任何明确的子字符串 但我需
  • 如何删除 woocommerce 添加的购物车项目并重定向到结帐?

    我有一个用于 添加资金 的 Woocommerce 表格 它有一个金额输入字段 20 美元 30 美元 等 和一个提交按钮 该按钮重定向到购物车页面 其中输入的金额为总计 重定向到结账正常 但如果用户放弃购物车并尝试再次订购 则购物车商品不
  • 移动圆弧上出现半径线

    我试图创建这些移动的形状 该形状由半圆形和对称的上弧和下弧组成 它们应该只是前面的形状 但现在当它们移动时 后面会拖着一条像尾巴一样的线 尾部未知的输出形状 这些线似乎来自上下弧的 moveTo 部分 但我不知道如何解决它 我应该在哪里改变
  • 在 WPF 中将像素转换为 CM

    I have New System Windows LengthConverter ConvertFrom 1cm 37 795275590551178 Double Double 37 795275590551178 So in 1cm
  • 我们如何使用资产目录颜色集?

    我通常使用 Swift 扩展在 iOS 上使用自定义 UIColor 但现在使用 iOS 11 Xcode 9 我们可以创建颜色集 我们如何使用它们 更新 提示 正如 C ur 所说 我们可以拖放颜色 并将其用作 UIColor 对象 可能
  • 在 Cordova 插件中使用 iBeacons,即在活动/服务之外

    我正在尝试编写一个 Cordova 插件 它与 Android 的 Radius Networks iBeacon 库进行交互 现在 我知道该库是为与活动 服务一起使用而设计的 但这在我的情况下不起作用 因此我正在尝试根据文档尽可能地调整它
  • C# 解析文本文件并将值存储在数组中

    我正在尝试将具有以下格式的文本文件读入数组 Previous errors were for Test id 1234567 Error id 12345678 Previous errors were for Test id 123456
  • 如何清除实体框架中跟踪的实体

    我正在运行一些在一大堆实体上运行的修正代码 随着它的进展 速度会降低 这是因为上下文中跟踪的实体数量随着每次迭代而增加 这可能需要很长时间 所以我在最后保存更改每次迭代的 每次迭代都是独立的 不会更改先前加载的实体 我知道我可以关闭更改跟踪
  • 从 C# 调用托管 C# COM 对象

    我正在尝试从 C 调用 C COM 对象 我用 C 创建了一个类库 并使用 tlbexe exe 导出了一个类型库 然后我使用 regtlibv12 exe 注册了类型库 但是 当我在 Visual Studio 中添加对 COM 对象的引
  • 使用 array_search 进行多维数组

    在一维数组中使用 array search 很简单 array array apple banana cherry searchValue cherry key array search searchValue array echo key
  • 如何在R编程中读取和解码二维码图像? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 如何在R编程中读取和解码二维码图像 我想将带有二维码的图像转换为文本 R 有用于生成 QR 码的库 如 package qrcode 和 packa
  • eclipse 中junit 的等宽字体?

    如何更改 JUnit 选项卡中的字体 以便它使用等宽字体显示结果 我正在使用 Groovy 我找到了解决方案here 您需要转到 Groovy gt Preferences 并选中使用等宽字体复选框
  • ag-grid v 22.1.1 升级后 ng build --prod 失败

    我已经开始使用ag grid从版本 18 开始 目前为 20 0 0 我正在升级到最新版本 22 1 1 解决由于重大更改而导致的警告 错误后 一切 包括 ng服务 都工作正常 但是 当我尝试在产品模式下构建角度应用程序时 它失败了 app
  • x86-64:规范地址和实际可用范围

    Intel 和 AMD 文档称 对于 64 位模式 实际上只有 48 位可用于虚拟地址 并且从 48 到 63 的位必须复制位 47 符号扩展 据我所知 当前所有的CPU都是以这种方式实现的 但是 理论上 没有什么禁止在未来的实现中扩展可用
  • 如何将jsPDF转换后的pdf文件发送到后端服务器?

    我需要将 png 文件发送到后端服务器 我使用 jsPDF 将其转换为 pdf var doc new jsPDF l mm 210 210 doc addImage myPngData PNG 0 0 210 210 现在我需要使用我的老
  • 如何阅读“fetch(PDO::FETCH_ASSOC);”

    我正在尝试使用 PHP 构建一个 Web 应用程序 并且我正在使用内存缓存用于存储数据库中的用户数据 例如 假设我有以下代码 sql SELECT FROM users WHERE user id user id stmt this gt
  • 从元模型强制执行单个实例

    我知道从类级别确保单个实例要容易得多 而且有很好的StaticishJonathan Stowe 的模块通过使用角色来执行相同的操作 但我只是想尝试更好地理解如何阶级高阶工作可以处理 主要是针对FOSDEM的讲 我可以想到在元模型级别上执行