破坏后无法在AHK中创建类

时间:2018-01-11 07:56:27

标签: class object autohotkey construction destruction

我正试图围绕AHK的课程。我是C ++ dev,所以想使用RAII(__New__Delete),但看起来我错过了一些概念,因为对我来说,事情看起来非常直观。

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

class Scenario
{
  __New()
  {
    MsgBox, NEW
  }

  __Delete()
  {
    MsgBox, DELETE
  }
}

scenario := new Scenario
scenario := new Scenario
scenario := 1
scenario := {}
scenario := new Scenario
Return

因此,我收到以下消息:

  1. NEW
  2. NEW
  3. DELETE
  4. DELETE
  5. 问题:

    1. 为什么在第二次分配期间对象不会被销毁?我假设ref的数量为0,没有?
    2. 为什么我连续2次破坏?那个对象在哪里同时存储? scenario变量如何保存两个引用?
    3. 为什么第三个建筑没有被召唤?

2 个答案:

答案 0 :(得分:0)

  
      
  1. 为什么在第二次分配期间对象没有被销毁?
  2.   

尚未触发垃圾收集

  

我假设参考数量为0,没有?

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

  
      
  1. 我怎么连续两次破坏?
  2.   

垃圾收集同时清除了两个引用

  

同时存储该对象的位置是什么?

  

情景变量怎样才能同时包含两个引用?

scenario不包含两个引用

  
      
  1. 为什么第三个建筑没有被召唤?
  2.   

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

答案 1 :(得分:0)

好的,找出了遗漏的东西。两件事:

  1. AHK脚本不区分大小写。
  2. 由于class在AHK中是一个对象,因此可以用另一个对象覆盖该类。
  3. Here是文档的一部分:

      

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

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

    此外,由于在分配之前创建了类的新实例,因此我连续两个“NEW”,而不是“DELETE”。