作者laechan (小太保)
看板mud
标题[闲聊] 递回 query
时间Tue Feb 26 11:21:41 2013
lpmud 的 _query 函数大概是这麽写的...
mixed _query( mapping map, string label )
{
mapping v;
string *parts;
parts=explode( label, "/" );
v=map[parts[0]];
if( sizeof( parts )==1)
return v;
if( undefinedp(v) || !mapp(v) ) return 0;
return v[parts[1]];
}
这意思是说,如果 label = "exits/north",那麽它就回传
map["exits"]["north"] 的值。
那麽,假设今天 map 是一个学校的资料,其结构如下..
map=([
"一年五班":([
"王小明":([
"英文":100,
"数学":100,
]),
]),
.
.
]);
那麽有没有可能实现 query("一年五班/王小明/英文") 的
语法呢?_query 函数可以这样改...
mixed _query( mapping map, string label )
{
int n,m;
mapping v;
string *parts;
parts=explode( label, "/" );
v=map[parts[0]];
n=sizeof( parts );
m=strlen(parts[0]);
if( n==1)
return v;
// 以上都不变只是令
// int n = sizeof(parts);
// int m=strlen(parts[0]);
// 底下便是多出来的两行
else if(n>2)
return _query(map[parts[0]],label[m+1..strlen(label)-1]);
if( undefinedp(v) || !mapp(v) ) return 0;
return v[parts[1]];
}
实装上述程式码後,测试结果如下...
> call me;query;"name"
玩家(laechan /std/user)-> query( "name" ) =
"laechan"
> call me;query;"skill/barefist"
玩家(laechan /std/user)-> query( "skill/barefist"
) =
9900
这两个值以传统的读取方式都能正确读取。
然後我在 env 设了一个参数值 test_data
test_data :([ "test1" : ([ "test2" : ([ "test3" : 4 ]) ]) ])
然後做底下的动作..
> call here;query;"test_data/test1"
房间(/u/l/laechan/skycastle/room/street/supply1)-> query(
"test_data/test1" ) =
([ "test2" : ([ "test3" : 4 ]) ])
> call here;query;"test_data/test1/test2"
房间(/u/l/laechan/skycastle/room/street/supply1)-> query(
"test_data/test1/test2" ) =
([ "test3" : 4 ])
> call here;query;"test_data/test1/test2/test3"
房间(/u/l/laechan/skycastle/room/street/supply1)-> query(
"test_data/test1/test2/test3" ) =
4
传统上,遇到资料层度较高的 map data,一般都不会将其以 ob->set
的方式来储存,而是会在物件上宣告 mapping data 来处理,它的优点
是资料独立於 ob_data 之外,具隐藏性(除非建立方式存取不然看不到
资料),缺点是需建立存取方法,无法以既有的 set/add/delete/query
等方式来操作。
这时若将这些函数改成支援递回,就可顺利读取深层资料,同样的修改
可套用在 _set、_add、_delete 等由 /adm/simul_efun/prop_login.c
宣告的函数上。
一点心得,跟大家分享。这东西其实可有可无,因为通常资料层度三就
已经够高了,而三转二有变通做法,例如圣殿有 effect 设定..
set("effect/stat-str",10);
上面的 - 即是变通做法,若照一般结构应是 effect/stat/str,也就
是 data["effect"]["stat"]["str"] → data["effect"]["stat-str"]
,此即三转二的简易做法(以 - 做一种识别)。
递回改法的好处,是可用 _query 这个 simul_efun 来对 mapping 资料
做深层呼叫。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.61.157.53
※ 编辑: laechan 来自: 210.61.157.53 (02/26 11:36)