销毁后无法在 AHK 中创建类

Posted

技术标签:

【中文标题】销毁后无法在 AHK 中创建类【英文标题】:Cannot create class in AHK after destruction 【发布时间】:2018-01-11 07:56:26 【问题描述】:

我正在尝试围绕 AHK 的课程进行学习。我是 C++ 开发人员,所以想使用 RAII(__New__Delete),但看起来我错过了一些概念,因为这对我来说看起来非常违反直觉。

经过一些尝试,我想出了这个简单的例子:

class Scenario

  __New()
  
    MsgBox, NEW
  

  __Delete()
  
    MsgBox, DELETE
  


scenario := new Scenario
scenario := new Scenario
scenario := 1
scenario := 
scenario := new Scenario
Return

因此,我收到以下消息:

    新 新 删除 删除

问题:

    为什么在第二次分配期间对象没有被销毁?我会假设 refs 的数量为 0,不是吗? 我怎么会连续收到 2 次破坏?同时该对象存储在哪里? scenario 变量如何同时保存两个引用? 为什么不调用第三个构造?

【问题讨论】:

【参考方案1】:
    为什么在第二次分配期间对象没有被销毁?

尚未触发垃圾回收

我假设 refs 的数量会变为 0,不是吗?

到 0 的引用不一定会触发 GC

    我怎么会连续 2 次破坏?

垃圾回收同时清理了两个引用

同时该对象存储在哪里?

场景变量如何同时保存两个引用?

scenario 不包含两个引用

    为什么不调用第三个构造?

只构造了两个 Scenario 对象。变量scenario 是一个动态变量,并不总是Scenario 类的实例。最后一个赋值 scenario := 只是创建了一个空对象。

【讨论】:

好的,我想我忘了在最后添加一行 - 在返回之前再添加一行 scenario := ... - 更新了代码。看起来分配给 会触发垃圾收集,之后我无法再创建新对象。这仍然不能回答为什么当 ref 计数器变为零时它没有被收集。您是否有描述整个垃圾收集的文档的链接?【参考方案2】:

好的,找出丢失的内容。两件事:

    AHK 脚本不区分大小写。 由于 class 在 AHK 中本身就是一个对象,因此可以用另一个对象覆盖该类。

Here 是文档的一部分:

因为类是通过变量引用的,所以类名不能同时用于引用类和在同一上下文中创建单独的变量(例如保存类的实例)。例如,box := new Box 会将 Box 中的类对象替换为自身的一个实例。 [v1.1.27+]:#Warn ClassOverwrite 允许在每次尝试覆盖类时在加载时显示警告。

这解释了上面代码中发生的事情:变量名scenario 实际上与类名Scenario 相同,所以我只是悄悄地用一个空对象覆盖了我的类。

另外,由于类的新实例是在分配之前创建的,所以我连续得到两个“NEW”,只有“DELETE”。

【讨论】:

以上是关于销毁后无法在 AHK 中创建类的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 4 中创建类的非零属性数组

在 nib 文件中创建类的实例

如何在 C++ 中创建类对象的向量?

intellij idea中创建类时,模板文件DATE格式多出个0011问题,例如yyyy/MM/dd 00dd

C++ 难以在单例类中创建类的实例

为啥我们在 React 中创建类组件时要扩展 React.Component?