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

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(使用前将#替换为@)

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

  • 如何安装DBMonitor

    这可能是一个非常简单的问题 但就是这样 我刚刚更新了 Firebird 的 DevArt DBExpress 驱动程序的许可证 帮助文件说我可以使用他们的免费软件 DBMonitor 应用程序 但由于我使用的是 D2006 所以我必须使用以
  • 在 Delphi 中强制非阻塞临时提示窗口

    我一直在寻找 但找不到解决方案 所以我想也许我应该简单地发布它 这是我想要在 Delphi 2009 中做的事情 在我的应用程序中的某个时刻 我想向用户显示一条消息 这应该是正常的提示窗口 在正常应用程序定义的提示暂停后自动消失 并带有自定
  • 在 Inno Setup 中使用 StringToColor

    我想为表单上的标签 TNewStaticText 属性颜色 TColor 读写 分配一些颜色 我将颜色存储为 RRGGBB 字符串 我想使用 Delphi 函数 StringToColor 将其转换为 TColor 但如果我在脚本中使用此函
  • Delphi错误数据集未处于插入或编辑模式

    客观的 单击 TRxDBCombo 上的按钮调用搜索框 从搜索框中选择记录时 结果将设置为 TComboEditBox 的字段值 并发布在 TRxMemoryData 数据集中 错误 第二次调用此函数时出现数据集未处于插入或编辑模式 TDB
  • 可选参数与空参数方法以及带重载的构造函数

    简单来说 假设你有两种方法 public static void WriteMessage Console Write Empty Parameter Function public static void WriteMessage str
  • 递归遍历树视图中的节点?

    我有一个树视图 其中已经填充了另一个过程中的文件 文件夹 我想按照从上到下的确切顺序逐项迭代树视图中的项目 但是 与普通列表不同 我不能仅使用简单的for对此的声明 我必须进入每个节点等 我该怎么做呢 我希望有一种方法可以在不运行递归过程的
  • Delphi (Indy) TIdTCPClient 在线程中

    在互联网上 我看到通常将 TIdTCPClient 放置在自定义 TThread 后代中 为什么要这样做 有时我也在这样的线程中看到服务器 为什么 干杯 阿德里安 Indy 使用阻塞 I O 最好在线程中处理 这是 Indy 整体设计的核心
  • 错误:使用 Microsoft WebService.dll 通过 Delphi7 规范化 XML

    我正在使用 Delphi7 修改旧项目以添加使用证书和签名 经过一番搜索后我发现XML 规范化函数 https learn microsoft com en us previous versions dd815358 v vs 85 但我无
  • 如何将我的图标添加到组件选项板页面中的组件? [复制]

    这个问题在这里已经有答案了 可能的重复 Delphi非可视化组件图像 https stackoverflow com questions 3319276 delphi non visual component image 如何将我的图标添加
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • 如何确保 FormClose 程序运行,无论程序如何退出?

    在 Delphi 7 中 我有一个 TMainForm FormClose 过程 旨在在程序退出时写出一些状态 这在手动关闭程序时效果很好 但是 我发现如果程序被 Windows 强制 退出 例如在 Windows 更新后需要重新启动 则不
  • 如何仅在调试模式下激活 ReportMemoryLeaksOnShutdown?

    我需要激活ReportMemoryLeaksOnShutdown报告应用程序内存泄漏的功能 但仅限于调试模式 当 Delphi IDE 运行时 我怎样才能做到这一点 如果您的意思是使用调试构建配置 D2007 编译的 调试模式 则您将定义
  • 如何在滚动框上创建缓慢的滚动效果?

    我喜欢在滚动框中平移图像后创建平滑的减慢滚动效果 就像平移地图一样谷歌地图 http maps google com 我不确定它是什么类型 但行为完全相同 当快速移动地图时 当您释放鼠标时它不会立即停止 而是开始减慢速度 有什么想法 组件
  • Delphi - 自XE8以来如何正确注册图形类?

    我正在编写一个 Delphi 包 它提供了一个新的自定义 TGraphic 对象 允许读取 VCL 组件 如 TImage 中的新图像格式 我最初使用 RAD Studio XE7 开发了这个包 并且运行良好 然而 我最近迁移到了较新的 R
  • 这是重载,不同类中具有相同名称和不同签名的方法吗?

    如果我有以下 Java 代码 class A public int add int a int b return a b class B extends A public float add float a float b return a
  • 当显示对话框时淡出应用程序的所有其他窗口?

    如何在 Delphi 2009 中调暗 淡出应用程序的所有其他窗口 Form 有一个 AlphaBlend 属性 但它仅控制透明度级别 但如果我们能有这样的东西那就太好了 集中窗口 http www anappaday com downlo
  • 德尔福数据结构

    我可能需要在 Delphi 中做一个项目 并且是该领域的初学者 目前 我正在网上搜索资源 但由于资源站点太少而感到困惑 首先 你能给我一些好的网站 其中包含我迄今为止错过的 Delphi 资源吗 我也在 Delphi 中搜索数据结构 想知道
  • 了解 Scala 中的中缀方法调用和缺点运算符(::)

    我对 Scala 编程语言相当陌生 当我遵循以下网站的讲义时 我正在尝试一些萦绕在我脑海中的东西 here http horstmann com sjsu cs152 04 closures1 html 我想我无法真正理解 cons 运算符
  • Delphi 返回 TList 时出错

    我做了一个非常简单的应用程序 但我有一个我真的无法理解的问题 看一下这个基本代码 unit Unit1 interface uses Winapi Windows Winapi Messages System SysUtils System
  • 以编程方式重新启动 Delphi 应用程序

    应该不可能运行我的应用程序的多个实例 因此项目源码包含 CreateMutex nil False PChar ID if GetLastError ERROR ALREADY EXISTS then Halt 现在我想以编程方式重新启动我

随机推荐

  • 如何将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