北大侠客行MUD论坛

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

lua函数请教,能否根据传入的参入调用对应函数。

[复制链接]
发表于 2012-5-9 11:33:46 | 显示全部楼层 |阅读模式
我再使用技术教程中的mush实现gps的代码
其中需要alias.lua实现过特殊路段,我是用下面代码实现的
  1. function alias:exec(sp)
  2.    if sp=="duhe" then
  3.        self:duhe()
  4.            --return
  5.    end
  6.    if sp=="em_gdl" then
  7.        self:em_gdl()
  8.            --return
  9.    end
  10.    if sp=="sk_to_xx" then
  11.       self:sk_to_xx()
  12.    end
  13.    if sp=="xx_to_sk" then
  14.       self:xx_to_sk()
  15.    end
  16.    if sp=="tssl_to_sk" then
  17.       self:tssl_to_sk()
  18.    end
  19.    if sp=="sk_to_tssl" then
  20.       self:sk_to_tssl()
  21.    end
  22. end
复制代码
但是感觉这样很笨,有没有办法根据传入进来的sp内容,直接调用相应的self:sp代表的函数?
比如我sp传入的是sk_to_tssl,就直接调用self:sk_to_tssl()呢?

感觉lua的语法怪怪的,还没有switch。。。全部都是elseif嵌套,大家都这样实现switch吗?

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2012-5-9 13:46:03 | 显示全部楼层
可以用table来做,sample:
TransferPathTable = {
                          ["断魂崖"] = function() x = "(zou tiesuo)"; y = "(sd)" return x,y,true end,
                          ["缥缈峰山脚"] = function() x = "(zou tiesuo)"; y = "(sd) (sd)" return x,y,true end,
                          ["松林"] =   function() x = "(nw) (ne) (nu)"; y = nil return x,y,false end,
                          ["仙愁门"] = function() x = nil; y = nil return x,y,false end,
                          ["百丈涧"] = function() x = "(zou tiesuo)"; y = nil return x,y,true end,
                          ["青石大道"] = function() x = "(nw) (ne) (nu) (nu)"; y = nil return x,y,false end,
                          ["山路"] =   function() x = "(nw)"; y = nil return x,y,false end,
                          ["小路"] =   function() x = "(zou tiesuo)"; y = "(sd) (sd) s" return x,y,false end
                                }

function WalkToAddress(address)

        cmdWalk = "";
        temp = false;
        cmdWalk,ContinueAfterTiesuo,temp = TransferPathTable[address]();

        if (cmdWalk ~= nil) then
                DoAfterSpeedWalk(1,cmdWalk);
        end

        if (not temp) then
                DoAfter(2,"hp");
        end
end
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2012-5-9 14:38:31 | 显示全部楼层
  1. function duhe()

  2.   print("yell boat")

  3. end

  4. sp=duhe

  5. sp()
复制代码
上面这样可以,但是加self:sp()就不行了。而我不self:sp()又不正常。因为是alias.new出来的,必须通过self来具体到实例对象
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2012-5-9 15:13:33 | 显示全部楼层
我写个完成的测试例子吧。要不很难表达清楚
  1. ---测试
  2. testclass={
  3.   new=function()
  4.     local a={}
  5.         setmetatable(a, {__index = testclass})
  6.     return a
  7.   end,
  8. }

  9. function testclass:exec(sp)
  10.         sp()
  11.        
  12.    

  13. end

  14. function testclass:mytest()
  15.     print("我的测试类")
  16. end
  17. ---测试结束

  18. function do_test()
  19.    local t
  20.    t=testclass.new()
  21.    print(t)
  22.    t:exec("my_test")
  23. end
复制代码
通过do_test函数测试,在函数里创建testclass类的对象t,并调用t.exec("my_test")函数
通过传递的my_test字符串,我希望在上面面的exec函数里,可以直接调用和参数对应的函数。也就是
self:sp()
但是这样写会报错如下
Run-time error
World: rbt_test
Function/Sub: do_test called by alias
Reason: processing alias ""
[string "Script file"]:28: attempt to call local 'sp' (a string value)
stack traceback:
        [string "Script file"]:28: in function 'exec'
        [string "Script file"]:43: in function <[string "Script file"]:39>
Error context in script:
  24 :   end,
  25 : }
  26 :
  27 : function testclass:exec(sp)
  28*:  sp()
  29 :  
  30 :     
  31 :
  32 : end

提示没有sp这个方法。也就是传递过来的my_test只是字符串,而sp里报错的也是my_test字符串,不能通过sp()来调用到对应的函数。。。。

说的比较晕,大家明白我的意思吗?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-1 03:33 PM , Processed in 0.012046 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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