Squirrel中的类与实例

Squirrel是一个受到LUA影响的开源脚本语言,其类概念实现在表格基础上,导致类实例化时可能出现共享状态的情况。通过构造函数可以避免这种共享,实现每个实例拥有独立的表格副本,更接近传统的面向对象行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 10]><![endif]-->

Squirrel作为一个开源项目,其诞生收到了著名的脚本语言LUA的影响。和LUA不同的是,Squirrel提供了一种类似面向对象语言的表达能力,同时,它在很多语言的细节处理上与C或者C++更加接近。当然,由于其本质上仍然是以表格为基础的动态类型语言,所以它的面向对象能力常常和我们所习惯的C++的面向对象有着很大的不同。首先,它的所谓的类,其实也是一个表格,而类的实例化大致相当于类表格的浅拷贝。因此,如果在类中包含了表格、数组或者其他类的实例的话,在创建类对象的时候,类对象中对应的项目和类中引用的是相同的表格、数组或实例,也就是说,虽然没有把这些成员定义为静态,但他们的行为就相当于C++中的类的静态成员。如:

 

 

class Base

{

      embeded_table=

      {       

         entry = 0;

      }

}

 

local t1 = Base();

local t2 = Base();

t1.embeded_table.entry = 1;

print(t2.embeded_table.entry);

 

上面这段代码的输出是1,因为在类中嵌入的表格,实际上是对表格对象的引用,在生成类Base的实例t1, t2时,两个实例中的embed_table引用的实际上是同一份表格。

如果希望两个实例中各有自己的表格副本,则可以使用如下代码:

class Base

{

      embeded_table= null;

      constructor()

      {

         embeded_table = {

             entry = 0;

           }

      }

}

 

local t1 = Base();

local t2 = Base();

t1.embeded_table.entry = 1;

print(t2.embeded_table.entry);

上面的代码在创建类实例的时候复制类的成员的时候表格还未创建,而在构造函数中则为当前的实例创建专属实例的表格。这个类可以算是C++中的类的一个不怎么优雅的模拟,真正可以说是生成实例的一个模板了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值