将“增强记录”分配给普通“数据类型”变量时,应重载什么运算符?

2024-01-07

首先,我需要知道我想做的事情是否可行。如果可能的话,我需要知道如何做。

演示问题比解释问题要容易得多,所以这里是:

我有一个“增强记录”(目的 - 虽然对这个问题并不重要 - 是生成一个“智能字符串”类型,以替换普通的字符串类型):

TLKString = record
  Value: String;
  // Some methods here to operate on and build String values

  // Allows me to assign String values directly to "instances" 
  // of this record type! I have others (hence "overload") to 
  // handle other data types (such as Integer etc.)
  class operator Implicit(const AValue: String): TLKString; overload; 
end;

我现在可以使用这个 TLKString 类型,如下所示:

var
  LSmartString: TLKString;
begin
  LSmartString := 'Hello World'; // The "Implicit" operator then 
                                 // assigns this to LSmartString.Value
end;

好的,到目前为止一切都很好!现在我们遇到问题了......

我需要能够将 LSmartString (TLKString 的“实例”)的值分配给普通的字符串变量......

var
  LSmartString: TLKString;
  LNormalString: String;
begin
  LSmartString := 'Hello World';

  // The next line works fine, but is not what I want!
  LNormalString := LSmartString.Value; 
  LNormalString := LSmartString; // E2010 (Incompatible Types)
end;

这就是我遇到困难的地方,因为(我相信你会注意到),上面片段的最后一行结果是E2010 不兼容的类型:“string”和“TLKString”。当然,我知道情况会是这样……我不知道是否可以通过在 TLKString 记录类型上重载运算符来克服这个问题,如果可以,我需要重载哪个运算符来完成它。

如果这不可能,那么 CodeGear 和 Embarcadero 让我觉得有点愚蠢Implicit and Explicit运算符来处理将值分配给增强的 Record 类型,但没有运算符来处理相反的情况。


好吧,我自己已经回答了这个问题......这就是我所说的“显而易见”。

这是解决方案(为了他人的利益)

TLKString = record
  Value: String;
  // Some methods here to operate on and build String values
  class operator Implicit(const AValue: String): TLKString; overload; // handles String to TLKString assignment
  class operator Implicit(const AValue: TLKString): String; overload; // handles TLKString to String assignment! THIS IS THE ANSWER!
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将“增强记录”分配给普通“数据类型”变量时,应重载什么运算符? 的相关文章

随机推荐

  • 如何将AppHarbor与Slack集成?

    似乎没有官方集成 a t m 我怎样才能手动完成呢 我想要实现的是 每次构建从 通过 变为 失败 时 Slack 上都会发布一条 悲伤的 消息 每次构建从 失败 变为 通过 时 都应该发布不同的 快乐 消息 None
  • 如何将 Youtube 视频嵌入到我的应用程序中?

    我正在尝试为我的 Swift 应用程序创建一个视频播放器 但我不断收到 无法解析的标识符 AVPlayerViewController 的错误 我缺少什么 我是这方面的初学者 通俗地说我可能要问几千次 我已经在互联网上搜索了大约一天的视频
  • Django 多个 slug url

    我有两种蛞蝓 path
  • 两个极限之间缩放数字的数学方程不从 0 开始? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 例如 我有一个 1 100 之间的数字 我需要将其缩放到 20 80 之间 例子 1 scales to 20 100 scales to
  • 错误的键类:文本不是 IntWritable

    这似乎是一个愚蠢的问题 但我在 hadoop 的 mapreduce 代码中没有看到我的类型中的问题 正如问题中所述 问题是它需要 IntWritable 但我在减速器的collector collect 中向它传递了一个 Text 对象
  • 不支持的方法:eth_sendTransaction。 Alchemy 不持有用户的私钥

    我无法通过 Alchemy 从前端执行智能合约的发送交易方法 我是一个初学者 我正在尝试从我的前端执行一个方法 将交易发送到区块链 但我从 alchemy 收到一个错误 说该交易需要使用我的私钥签名 但我不知道如何执行此操作我在互联网上没有
  • 在 Swift 上从 kCBAdvDataManufacturerData 中提取数据

    我有一个 TI 传感器标签作为外设 以 kCBAdvDataManufacturerData 的形式广播 BLE 数据 我想从 iOS 中的数据中提取不同的值 我正在 Swift 中执行以下命令 func centralManager ce
  • 如何以 <60 秒的间隔运行 ColdFusion 计划任务?

    我有一个 CFC 方法 希望以 30 秒的间隔运行一次 但是 问题是 ColdFusion 不允许我安排以 60 秒或更短的时间间隔运行的任务 有人对我如何 并且应该 实现这一目标有建议吗 为了抢先回答 当你的脚本运行超过 30 秒时会发生
  • 调整居中径向渐变的半径大小

    我正在重新设计当前的项目 并找到了一种简单的方法来使用以下方法淡化 div 背景的左右边缘 我一直在尝试编辑中心圆的半径 以使其更小 我似乎无法改变它 除非整个渐变样式消失 我试图将黄色区域设置为文本的背景 逐渐淡入透明 我需要做什么才能获
  • 以编程方式从 *.cls 或类似文件将模块导入 access

    如果打开 Microsoft Access 则打开 Visual Basic 窗口 以便您可以看到 Access 项目中的模块和代码列表 您可以从 Windows 资源管理器中拖动基于文本的文件 txt cls bas 等 并将其放入模块文
  • 是否可以替换操作系统的Loader?有什么办法获得Loader的控制权吗?

    我只是想知道是否可以替换操作系统的加载程序 可执行程序加载程序而不是引导加载程序 Windows 是我的选择 是否有任何第三方加载程序可以修补默认加载程序 有什么方法可以让我获得对 OS Loader 的控制权吗 我的意思是 我希望它所做的
  • 有 ISO-Prolog 参考实现吗?

    Java https jdk7 java net java se 7 ri has a 参考实现 http en wikipedia org wiki Reference implementation ISO Prolog 有参考实现吗 我
  • OSError:未找到名为“cairo-2”的库(从 Custom_Widgets 导入 ProjectMaker)

    如何修复这个错误 C Users vanvl OneDrive Bureaublad Progammeren Project 1 02 2 gt python Python 3 9 13 tags v3 9 13 6de2ca5 May 1
  • 如何使用 D3DPT_TRIANGLESTRIP 基元类型在 DirectX 中绘制两个分离的矩形

    我是 DirectX 新手 我正在尝试使用以下命令在一个场景中绘制两个矩形D3DPT TRIANGLESTRIP 一个矩形没问题 但两个矩形则完全不同 是的 我可以使用用 绘制的四个三角形来绘制它们D3DPT TRIANGLELIST原始类
  • 如何向工具栏添加调用 JavaScript 函数的自定义按钮?

    我想在工具栏上添加一个按钮来调用 JavaScript 函数 例如Tada 关于如何添加这个有什么想法吗 还有一种很好的方法允许人们在不创建插件的情况下添加按钮 html
  • 如何使用 CSS 或 Jquery 覆盖 left:0?

    我有一个元素 它具有以下 CSS elem left 0 position fixed right 0 width 60 z index 1000 该元素不跨越整个屏幕 我希望它 对齐 到屏幕的右侧 如果我删除的话 这会很容易left 0
  • SNMP 代理的测试 URL

    我正在尝试查找 SNMP 代理的 URL 列表 我可以将其用于测试目的 到目前为止 我已经使用了 NET SNMP 测试 url gt test net snmp org 我还使用 Verax Simulator 来模拟特定代理 不过 请问
  • Django 根据 ChoiceField 选择显示字段

    我一直很难找到如何在 django 中创建一个依赖于表单中另一个字段的选择的文本字段 仅当选择设置为 购买 时才需要显示此字段 现在我遇到一个问题 它不会根据下拉选择进行更新 而是仅在我点击按钮 提交 表单后进行更新 有没有办法获取当前选择
  • RISC-V 使用 LUI 和 ADDI 构建 32 位常量

    LUI 加载立即数 用于构建32位常量并使用U型格式 LUI 将 U 立即数放入目标寄存器 rd 的高 20 位 并用零填充最低 12 位 我在手册中找到了这个 但是如果我想将 0xffffffff 移动到寄存器 我需要的所有代码是 LUI
  • 将“增强记录”分配给普通“数据类型”变量时,应重载什么运算符?

    首先 我需要知道我想做的事情是否可行 如果可能的话 我需要知道如何做 演示问题比解释问题要容易得多 所以这里是 我有一个 增强记录 目的 虽然对这个问题并不重要 是生成一个 智能字符串 类型 以替换普通的字符串类型 TLKString re