aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8269|回复: 2

关于table赋值是传递地址的一点疑问。

[复制链接]

6

主题

8

回帖

110

积分

一级会员

积分
110
发表于 2018-3-27 12:20:32 | 显示全部楼层 |阅读模式
最近看论坛上的帖子,里面提到了table赋值其实是传递地址的要点。我现在还有一点凝问,我需要提取一些数据到一个表里。下面的代码里,我用了两种方法来提取,一种是克隆表,一种是重新定义变量,两都的结果是一样的,但不知道哪种方式会更符合规范,或者运算效率高些,或者不占用内存些?
  1. import console;
  2. import table;

  3. var str = /*
  4. 张同学=张先生,张女士;
  5. 李同学=李先生,李女士;
  6. 王同学=王先生,王女士;
  7. 刘同学=刘先生,刘女士;
  8. */

  9. //第一种方法,克隆表
  10. var info1,fm1 = {}, {};
  11. if (str){
  12.     for  m,m2 in string.gmatch(str ,"(\S+?)=(.+?);") {
  13.                var  tab = string.split(m2,',');
  14.                fm1.父亲 = tab[1]
  15.                fm1.母亲 = tab[2]
  16.                 info1[m]=table.clone(fm1);
  17.         }
  18.    
  19.     console.dump(info1);
  20. }   


  21. //第一种方法,语句块内定义变量
  22. var info2 = {};
  23. if (str){
  24.     for  m,m2 in string.gmatch(str ,"(\S+?)=(.+?);") {
  25.                var tab = string.split(m2,',');
  26.                var fm2 = {};
  27.                fm2.父亲 = tab[1]
  28.                fm2.母亲 = tab[2]
  29.                 info2[m]=fm2;
  30.                 fm2 = null  //此行有没有必要写?  
  31.     }
  32.    
  33.     console.dump(info2);
  34. }   
复制代码

170

主题

2184

回帖

1万

积分

管理员

积分
13236
发表于 2018-3-27 14:03:10 | 显示全部楼层
用table.clone() 或者 重新定义一个表的方法都可以。
一般没必要用 table.clone() 直接  var fm2 = {}; 就可以,你重新定义的就不是同一个table了。

我基本上从来不用  table.clone()。

170

主题

2184

回帖

1万

积分

管理员

积分
13236
发表于 2018-3-27 14:04:03 | 显示全部楼层
fm2 = null  //此行有没有必要写?  
这种写法是多此一举,局部变量超出作用局自动就是null了。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-4-19 13:34 , Processed in 0.058022 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表