mud 板


LINE

看板 mud  RSS
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)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP