北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 12718|回复: 9

【lua】怎么获得hashtable中的元素个数?

[复制链接]
发表于 2011-12-27 18:11:15 | 显示全部楼层 |阅读模式
lua里的table可以当作hashtable来用,例如:
local ht = {name="xx", weight=128, location="yangzhou"};
但是,不知道有什么好的办法能得到hashtable内的元素个数?
我目前只能用如下的方法实现:
  1. function count(ht)
  2.     local n = 0;
  3.     for _, v in pairs(ht) do
  4.         n = n + 1;
  5.     end
  6.     return n;
  7. end
复制代码

注意:#ht对普通数组是有效的,但对hashtable来说,是得不到有效个数的。

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2011-12-27 23:31:50 | 显示全部楼层
获得表的最后一个索引的运算符#
获得表的最大数值索引table.maxn
好像没发现其他的
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2011-12-27 23:33:01 | 显示全部楼层
table.getn(table)
返回table中元素的个数
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2011-12-27 23:38:46 | 显示全部楼层
table.getn(tableName)      
等同于操作符 #
作用:得到一个table的大小。
注意:该table的key必须是有序的,索引是从1开始的。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2011-12-27 23:40:11 | 显示全部楼层
无序表就是用楼主的方法了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2011-12-27 23:45:40 | 显示全部楼层
那你得实现几个metamethod
newindex,用于给这个table添加新项目的时候
len,用于获取table的长度

你可以在table里包含一个隐藏的字段,每次newindex调用的时候,给这个字段加1,然后调用len的时候返回这个字段的值。

lua的设计很“极限”,呵呵。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2011-12-28 09:06:51 | 显示全部楼层
用#号来获得table的长度只能局限于key是1,2,3,4等类型.
如果key是文字或字符串,lz的方法是不错的.
就是用个泛性for 来计数下,每个key加1
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2011-12-28 20:55:35 | 显示全部楼层
那你得实现几个metamethod
newindex,用于给这个table添加新项目的时候
len,用于获取table的长度

你可以 ...
jason 发表于 2011-12-27 11:45 PM


很不幸,你说的这种方法是不行的。首先,看__newindex的定义:
  1.      function settable_event (table, key, value)
  2.        local h
  3.        if type(table) == "table" then
  4.          local v = rawget(table, key)
  5.          if v ~= nil then rawset(table, key, value); return end    -- 当table中key所对应的值不为空时,直接rawset并返回
  6.          h = metatable(table).__newindex
  7.          if h == nil then rawset(table, key, value); return end
  8.        else
  9.          h = metatable(table).__newindex
  10.          if h == nil then
  11.            error(···)
  12.          end
  13.        end
  14.        if type(h) == "function" then
  15.          h(table, key,value)           -- call the handler
  16.        else h[key] = value             -- or repeat operation on it
  17.        end
  18.      end
复制代码


从上面那句关键的话可以看到,对于ht[key]=nil;这样的语句,如果ht中已经存在key,就不会触发__newindex中的后续处理。
也就是说,只要有删除元素的操作,统计计数就会出错。

再来看len的定义:

  1.      function len_event (op)
  2.        if type(op) == "string" then
  3.          return strlen(op)         -- primitive string length
  4.        elseif type(op) == "table" then
  5.          return #op                -- primitive table length  -- 若op是table,则直接返回原生的#op
  6.        else
  7.          local h = metatable(op).__len
  8.          if h then
  9.            -- call the handler with the operand
  10.            return (h(op))
  11.          else  -- no handler available: default behavior
  12.            error(···)
  13.          end
  14.        end
  15.      end
复制代码


从上面的关键的语句可以看出,对于table的#操作符,是无法修改的。

综上所述,lua中的metatable,并不是操作符重载语法。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-3-1 21:00:20 | 显示全部楼层
膜拜中。。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-3-1 23:22:17 | 显示全部楼层
没下文了?求下文呀。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 07:49 AM , Processed in 0.011910 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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