如何使用元对象协议向对象添加属性?

2023-11-27

我试图回答this问题,并认为我可以使用元对象协议向类添加属性。这是一个我尝试添加属性的最小示例test到班级Configuration施工后:

use v6;

class Configuration {
}

my $config = Configuration.new;
my $attr = Attribute.new(
    :name('$.test'), # Trying to add a "test" attribute
    :type(Str),
    :has_accessor(1), 
    :package(Configuration)
);
$config.^add_attribute( $attr );
$config.^compose();
say "Current attributes: ", join ', ', $config.^attributes();
$attr.set_value( $config, "Hello" ); # <-- This fails with no such attribute '$.test'
say $config.test;

当我运行这个时,我得到:

Current attributes: $.test
P6opaque: no such attribute '$.test' on type Configuration in a Configuration when trying to bind a value
  in block <unit> at ./p.p6 line 16

属性不能在类组合时间之后添加,这发生在编译时关闭时}编译程序时就达到了。 (这是针对以下情况的P6opaque表示。存在允许这样做的表示并非不可能,但目前还没有指定。)

更进一步说,.^add_attribute在元对象上调用,并且对于class属性是按类型计算的,而不是按对象计算的;代码结构表明,期望可能是针对每个对象的。没有什么可以使原型面向对象变得不可能(实际上 MOP 的设计是为了让有人可以在 Perl 6 中实现这样的对象系统),但同样,Perl 6 本身没有指定任何内容来提供这一点。

因此,对于提供的对象系统,此类操作需要在编译时和关闭之前完成}。可以通过以下方式实现:

class Configuration {
    BEGIN {
        my $attr = Attribute.new(
            :name('$!test'), # Trying to add a "test" attribute
            :type(Str),
            :has_accessor(1),
            :package(Configuration)
        );
        Configuration.^add_attribute( $attr );
    }
}

my $config = Configuration.new;
say "Current attributes: ", join ', ', $config.^attributes();
$config.^attributes[0].set_value( $config, "Hello" );
say $config.test;

这是 Perl 6 动态的众多地方之一,主要是通过邀请程序员参与编译时,而不是通过在运行时使所有事情成为可能。

最后,我要指出的是,有一种方法可以在每个对象的基础上向现有对象添加属性:通过使用does混合一个角色。这是通过改变对象的类型来实现的。有一些文档does here.

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

如何使用元对象协议向对象添加属性? 的相关文章

  • 什么时候需要使用 new 来初始化 F# 类型?

    给定一个类 例如 type MyClass member this Greet x printfn Hello s x 使用初始化实例是否合适 let x new MyClass 或没有new 另外 什么时候使用new构造函数比 a 更有用
  • 类变量在其定义范围内?

    这可能是一个愚蠢的问题 我正在尝试制作文本泥 我需要每个 Room 类包含其他 Room 类 以便在尝试移动到它们或从它们获取信息时可以引用 但是 我不能这样做 因为我显然无法在其定义中声明一个类 那么 我该怎么做呢 当我说我做不到时 我的
  • 类外函数

    我只是想告诉你 我是 OOP 的新手 这对我来说相当困难 但这是我的代码 class functions function safe query string string mysql escape string htmlspecialch
  • 修改对象实例的 TypeScript 类装饰器

    我正在为 Aurelia 制作一个插件 需要一个类装饰器 将属性添加到新对象实例 并且 使用新对象作为参数调用外部函数 我已经查看了示例 到目前为止我已经将它们放在一起 伪 代码 return function addAndCall tar
  • Typescript 继承:扩展基类对象属性

    当扩展一个类时 我可以轻松地向它添加一些新属性 但是 如果当我扩展基类时 我想向基类的对象 简单对象的属性 添加新属性怎么办 这是一个带有一些代码的示例 基类 type HumanOptions alive boolean age numb
  • 扩展Android应用程序类

    当我正在寻找从远程设备获取错误报告的解决方案时 就像 iOS 中的试飞应用程序一样 我发现了acra适用于 Android 设备here http code google com p acra wiki BasicSetup 在基本设置中
  • 当类的任何属性被修改时,类如何运行某些函数?

    是否有一些通用方法可以让类在以下情况下运行函数 any它的属性被修改了吗 我想知道是否可以运行某些子进程来监视类的更改 但也许有一种方法可以继承class并修改一些on change函数是 Python 类的一部分 有点像默认的 repr
  • 如何向未命名的类添加构造函数/析构函数?

    有没有办法在未命名的类中声明构造函数或析构函数 考虑以下 void f struct some implementation inst1 inst2 f implementation usage of instances 后续问题 实例当然
  • 了解 self 和 cls 之间的区别以及它们是否引用相同的属性

    我试图了解两者之间是否存在差异self and cls但我正在挣扎 尽管存在很多关于这个话题的讨论 例如 class maclass A class method def init self self B instance method d
  • 是否可以使用“+”运算符添加同一类的两个对象

    我的教科书说我们可以添加同一类的两个对象 V3 V2 V1 全部属于同一类 但是当我在 Turbo c 中测试时 我得到错误 指向同一行的非法结构操作 V3 V1 V2 所以我的问题是是否可以使用 运算符添加同一类的两个对象 如果答案是肯定
  • 用于创建类图的工具[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 请建议用于创建符合以下标准的类图的工具 它应该是平台无关的 因为我使用 Linux 并且该文件预计由使用 Windows Mac 的团队其
  • 我如何使用 cout << myclass

    myclass是我写的一个C 类 当我写的时候 myclass x cout lt lt x 我该如何输出10 or 20 2 就像一个integer or a float value 通常通过重载operator lt lt 对于你的班级
  • Python 类中的继承顺序

    我有课ExampleSim它继承自基类Physics class Physics object arg1 arg1 def physics method print physics method class ExampleSim Physi
  • 如何重写 NQPMatch.Str 函数

    或者如何改变
  • C#:为派生类继承单独的静态成员

    我的问题简述 class A Other stuff in my class protected static staticMember class B A Other stuff in my class Will have A stati
  • 如何禁用 Perl 6 REPL 创建 .precomp

    每次我跑步perl6进入REPL模式 它创建了一个 precomp目录 这也会减慢提示的出现速度 如果 precomp目录已经存在 提示几乎立即出现 否则perl6创建它需要几秒钟 有没有办法禁用此功能 检查您是否有PERL6LIB环境变量
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • PHP 中的 -> 和 :: 有什么区别?

    这个东西困扰我好久了 一直找不到 在 php 中使用 和 gt 之间的类有什么区别 让我举个例子 想象一个名为 MyClass 的类 该类中有一个函数 myFunction 使用有什么区别 MyClass myclass new MyCla

随机推荐

  • UIScrollView 触摸开始

    所以我想做的就是当用户触摸 UIScrollView 时播放声音 UIScrollViewDelegate有scrollViewWillBeginDragging 方法 但它只在touchMoved时被调用 我希望它在 touchBegan
  • 创建不同长度的分类变量的汇总表

    在 SPSS 中 使用 自定义表 创建分类变量的汇总表相当容易 我怎样才能在 R 中做到这一点 通用和可扩展的解决方案是首选 并且使用的解决方案 Plyr 和 或 Reshape2 软件包 因为我正在尝试学习这些 示例数据 mtcars 在
  • 当我尝试从 eshell 启动时,我的主管崩溃了?

    我对 OTP 很陌生 我正在尝试创建简单的示例来理解主管行为 这是简单的增量服务器 module inc serv behaviour gen server export start 0 inc 1 stop 0 export init 1
  • 消息“错误:资源 android:attr/lStar 未找到”

    我开发的一个Flutter Android应用今天突然编译错误 Error 什么地方出了错 任务 app processDebugResources 执行失败 Android资源链接失败 Users xxx gradle caches tr
  • Python - 尽管已安装但未找到包

    我有以下版本的python import sys print sys version 3 6 5 packaged by conda forge default Apr 6 2018 13 44 09 GCC 4 2 1 Compatibl
  • LARAVEL 9. 错误 LARAVEL 电子邮件:无法使用 STARTTLS 连接:stream_socket_enable_crypto():SSL 操作失败,代码为 1

    向社区问好 我最近开发了一个网页Laravel 9 X 它在本地工作正常 但是当我将其上传到我的主机时 我在发送电子邮件时遇到问题 我在本地测试的时候一直工作正常 一直在使用mailtrap 现在我已经将其上传到服务器 我有自己的 SMTP
  • Bash - 在变量中保存 $@ 时保持空间安全

    我在循环这样的变量时遇到问题 我准备了2个例子来说明这个问题 ex1 bin bash DIRS for DIR in DIRS do echo DIR done ex2 bin bash for DIR in do echo DIR do
  • Xcode 6.01 存档验证错误:无效的段对齐

    我一直在做一个iOS项目仅在 Xcode 中 部署目标是 iOS 8 0 更新到 Xcode 6 x 后 在我的 iPhone 5s 和 iPhone 6 以及模拟器上构建和测试工作正常 但是 当我创建存档并想要验证它时 出现以下错误 由于
  • 如何删除 CSS 换行

    我正在尝试删除text decoration line through 样式应用于我的元素 但我似乎无法这样做 我努力了text decoration none 但它不起作用 当我申请时text decoration underline t
  • 什么是 crate 属性以及在哪里添加它?

    为了了解 Rust 的工作原理 我决定看一个基于终端的文本编辑器 名为Iota 我克隆了存储库并运行cargo build只能被告知 error if let syntax is experimental help add feature
  • 在日期字段中设置日期将其设置为前一天[重复]

    这个问题在这里已经有答案了 我正在使用日期输入类型来显示 获取 HTML 表单中的日期
  • Apache POI - 单元格 setCellValue 抛出 NullPointerException

    当我尝试更新现有 Excel 文件时 遇到以下错误 Exception in thread main java lang NullPointerException at xltest main xltest java 28 My code
  • TensorFlow:从多个检查点恢复变量

    我有以下情况 我有 2 个模型用 2 个单独的脚本编写 模型 A 由变量组成a1 a2 and a3 并且写成A py 模型 B 由变量组成b1 b2 and b3 并用 B py 编写 在每个A py and B py 我有一个tf tr
  • 多个纹理图像混合到 3D 地面上

    电脑游戏如何呈现自己的阵地 我将使用几何高度图 尽管我稍后会对其进行优化 但我想知道最好的技术是什么 例如 绘制 我的地面 到处都是草 到处都是土路 城镇里有砾石 每种材料之间的过渡也很平滑 我只使用巨大的预烘焙纹理吗 当我可以平铺现有纹理
  • 当前模态视图控制器

    我刚刚开始iPhone开发 我有一个选项卡式应用程序 我想以模式方式显示登录表单 所以我看了这里苹果开发者并在我的一个视图控制器中执行此操作 我将一个按钮连接到以下操作 import LoginForm h IBAction showLog
  • WxPython:PyInstaller 失败,没有名为 _core_ 的模块

    我正在使用 PyInstaller 将 wxpython 3 0 2 0 应用程序转换为二进制文件 这些二进制文件在 Ubuntu 12 04 上构建和执行时工作正常 但是 如果我在 Ubuntu 14 04 上构建 则会收到以下错误 当我
  • 如何使用大写列名的Rails?

    我有以下内容作为 AR 查询的一部分 having COUNT foo id gt bar maxUsers 这会产生一个错误 ActiveRecord StatementInvalid PG UndefinedColumn ERROR c
  • 为什么我的 php substr() 在剪切文本时显示模糊字符?

    我正在使用substr 函数限制字符串中的字符 但有时 输出文本包含一些晦涩的字符和问号等 substred 的文本已经是 UTF8 编码的 而不是在 html 实体中出现这样的问题 Thanks 因为你正在把你的角色切成两半 Use mb
  • 需要为 EmptyStacks 创建一个新的 RunTimeException

    所以我的任务可能听起来很简单 但它让我感到困惑 我已经浏览了互联网上的代码 但我无法掌握 我也不行 掌握老师发布的幻灯片 这就是对我的要求 创建一个名为 EmptyStackException 的新运行时异常类型 然而我不知道如何制作方法
  • 如何使用元对象协议向对象添加属性?

    我试图回答this问题 并认为我可以使用元对象协议向类添加属性 这是一个我尝试添加属性的最小示例test到班级Configuration施工后 use v6 class Configuration my config Configurati