CWDG论坛-专业魔兽插件's Archiver

青也 发表于 2007-9-13 19:28

self和this的区别是啥?

去[url=http://www.wowace.com/]www.wowace.com[/url]上边看了一些资料,ACE2的管网上也有没写的东东,例如AceConsole-2.0的说明就基本没有。。。

说正题,我看啊看啊,看到AceDB-2.0东西,他们的例子全部都是用self.db.account.xxx,我也这么写了以后报错,self是空值,不解中。。。。

还有问题,关于slash命令的,用ace的写法是作一个表,类似以下[language=lua]type = 'text',
   name = '名字',
   desc = '注释',
   usage = '使用方法',
   get = '函数a
   set = '函数b
    [/language]我这么写完以后,一共4个slash命令,都正常注册了,在Niagara下边也都能看到4个命令了,但是系统提示第二个命令制定的函数不是一个合适的函数。弄了一个下午无解,,,,

再问下函数a和函数b能合并成一个函数不?就是get和set后边都写一个名字。

biggates 发表于 2007-9-13 19:36

只有在类似于 aTable:Func() 的函数中,方可使用 self 来指代 aTable 。例如:
[language=lua]function phRaid2:OnInitialize()
    self.db.profile.Enabled = true
end[/language]
在全局名域中,self 值为空。

关于 AceConsole 的表的写法的内容,可以参见[url=http://www.wowace.com/wiki/AceOptions_data_table]http://www.wowace.com/wiki/AceOptions_data_table[/url]

属性的访问器 get 和 set 的功能是不同的,get 用于获取值,对应一个无参数的函数; set 用于设置值,对应一个单参数的函数。这是无法合并的。

另外,写出的Slash命令可以正确注册,说明没有语法问题。可以把你的表的代码和系统提示贴出来,进行进一步分析。

青也 发表于 2007-9-13 20:34

感谢楼上,好快的速度。。。

看了你的回帖,有点顿悟的感觉,以前出错是因为我把两个函数合并的原因。

LUA会自动把一个函数根据函数的内容判断这个函数的类型吧?我记得以前写C的时候用void去定义无参数的函数,但是LUA没有对应的写法。

当时写的时候也没有考虑的这些,只是看一个命令要对应两个函数,函数的内容又太少,所以就。。。。

biggates 发表于 2007-9-13 21:21

Lua 的函数声明:
[language=lua]function funca(arg1)
function funcb()
function funcc(arg1, arg2, ...)[/language]
和 C/C++ 的区别:
声明中没有规定返回值。返回值在函数体中用 return 语句返回。

PS:C/C++ 中的 void 是返回值类型。

青也 发表于 2007-9-14 03:50

这回明白了,再次感谢。

青也 发表于 2007-9-14 12:39

还是搞不定。。。那位有功夫帮我看下?谢谢!

[language=lua]
## Interface: 20000
## Title: tBc1c
## Notes: to Broadcast.
## Author: No.1dea
## Version: 0.1
## OptionalDeps: Ace2
## SavedVariables: tBc1cDB
## SavedVariablesPerCharacter: tBc1cDBPC
## X-Category: Chat/Communication
..\!!!cwdgacelibs\AceLibrary\AceLibrary.lua
..\!!!cwdgacelibs\AceOO-2.0\AceOO-2.0.lua
..\!!!cwdgacelibs\AceAddon-2.0\AceAddon-2.0.lua
..\!!!cwdgacelibs\AceDB-2.0\AceDB-2.0.lua
..\!!!cwdgacelibs\AceConsole-2.0\AceConsole-2.0.lua
..\!!!cwdgacelibs\AceEvent-2.0\AceEvent-2.0.lua
tbc1c.xml
[/language]

[language=xml]
<Ui>
<Script file="tbc1c.lua"/>
<Frame name="tbc1c">
   <Scripts>
    <OnLoad>
     tBc1c:OnEnable();
    </OnLoad>
   
    <OnUpdate>
     tBc1c:update(arg1);
    </OnUpdate>
  </Scripts>
</Frame>
</Ui>
[/language]

[language=lua]
t0 = 0   --计时器变量
opts = {
type = 'group',
args = {
  msg = {
   type = 'text',
   name = '消息:',
   desc = '要发布的信息',
   usage = '/self msg 你要发布的消息',
   get = 'GetMsg',
   set = 'SetMsg',
  },
  
   ch = {
   type = 'text',
   name = '方式',
   desc = '你要广播的方式',
   usage = '/self ch [wisper,say,yell,party,guild,officer,raid,raid_warning,battleground,wisper,channel]',
   get = 'GetCh',
   set = 'SetCh',
  },
  
  chna = {
   type = 'text',
   name = '频道',
   desc = '你要广播的频道名称',
   usage = '/self chna 频道名称',
   get = 'GetChNa',
   set = 'SetChNa',
  },
  
  t = {
   type = 'text',
   name = '间隔(秒)',
   desc = '发布信息的时间间隔',
   usage = '/self time 你要发布信息的时间间隔',
   get = 'GetTi',
   set = 'SetTi',
  },
}   
}
tBc1c = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0","AceConsole-2.0","AceDB-2.0");
tBc1c:RegisterChatCommand("/tbc1c", opts);
tBc1c:RegisterDB("tBc1cDB","tBc1cDBPC");
tBc1c:RegisterDefaults('profile',{
    msg = "下午好。",
    ch = "say",
    chna = "",
    t = t,
   });
   
function GetMsg()
  return self.db.profile.msg
end
function SetMsg(arg1)
  self.db.profile.msg = arg1
end
function GetCh()
  return self.db.profile.msg
end
function SetCh(arg1)
  self.db.profile.ch = arg1
end
function GetChNa()
  return self.db.profile.ch
end
function SetChNa(arg1)
  self.db.profile.chna = arg1
end
function GetTi()
  return self.db.profile.chna
end
function SetTi(arg1)
  self.db.profile.t = arg1
end


function tBc1c:OnEnable()
  self:RegisterEvent("ADDON_LOADED");
end
function tBc1c:ADDON_LOADED(arg1)
  if (arg1 == "Informant") then SendChatMessage("下午好!","say");end;
end;
function tBc1c:update(arg1)
  t0=t0+arg1
  
  if (t0 > self.db.profile.t) then
   do
    SendChatMessage(self.db.profile.msg,self.db.profile.ch,nil,self.db.profile.chna);
    SendChatMessage("☆★☆本消息"..self.db.profile.t.."秒重复一次,扰屏见谅。☆★☆",self.db.profile.ch,nil,self.db.profile.chna);
    t0=0;
   end;
  end;
end

[/language]

青也 发表于 2007-9-14 13:00

一共两个错误,一个还是老问题,函数不合适,晕ing....

第二个是存取的错误,貌似我存的变量还是没读出来,或者根本就没写进去(汗+寒)+ing....

详细的看图吧。

青也 发表于 2007-9-15 13:29

那位帮我看以下呗,麻烦了。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.