如何通过Lua编程实现对象的长尾词改写?
- 内容介绍
- 文章标签
- 相关推荐
本文共计445个文字,预计阅读时间需要2分钟。
示例代码修改如下:
lua-- 示例代码:创建一个Account对象function Account:new(o) o=o or {} setmetatable(o, self) self.__index=self return oend
-- 取自:http://www.lua.org/pil/16.1.-- 目的是:self.__index=self
说明:- 代码首先定义了一个名为`Account`的函数,该函数用于创建一个`Account`对象。- 如果调用者没有提供对象`o`,则使用一个空对象`{}`作为默认值。- 使用`setmetatable`设置`o`的元表为`self`,这样可以通过`self`访问`Account`类的所有方法和属性。- 将`self`设置为`o`的索引元方法,使得可以通过`o.方法名`或`o.属性名`直接访问`Account`类的成员。- 代码注释提供了代码来源和目的的说明。
示例代码:function Account:new (o) o = o or {} -- create object if user does not provide one setmetatable(o, self) self.__index = self return o end
取自:
www.lua.org/pil/16.1.html
目的是什么:
self.__index = self
线?为什么每次创建对象时都会执行它?
正如其他人所说,self(Account表)用作分配给使用new创建的对象的元表.当在’o’中找不到字段时,稍微简化(在提供的链接上提供更多信息),它会转到’帐户’表,因为o的metatable表示转到帐户(这是__index所做的).但是,每次创建对象时都不需要执行它.你可以很容易地把它粘在某个地方:
Account.__index = Account
它也会起作用.
更长的故事是,如果对象o具有metatable,并且metatable具有__index字段集,则o上的失败字段查找将使用__index来查找字段(__ index可以是表或函数).如果o已设置字段,则不要转到其metatable的__index函数来获取信息.不过,我再次鼓励您阅读上面提供的链接.
本文共计445个文字,预计阅读时间需要2分钟。
示例代码修改如下:
lua-- 示例代码:创建一个Account对象function Account:new(o) o=o or {} setmetatable(o, self) self.__index=self return oend
-- 取自:http://www.lua.org/pil/16.1.-- 目的是:self.__index=self
说明:- 代码首先定义了一个名为`Account`的函数,该函数用于创建一个`Account`对象。- 如果调用者没有提供对象`o`,则使用一个空对象`{}`作为默认值。- 使用`setmetatable`设置`o`的元表为`self`,这样可以通过`self`访问`Account`类的所有方法和属性。- 将`self`设置为`o`的索引元方法,使得可以通过`o.方法名`或`o.属性名`直接访问`Account`类的成员。- 代码注释提供了代码来源和目的的说明。
示例代码:function Account:new (o) o = o or {} -- create object if user does not provide one setmetatable(o, self) self.__index = self return o end
取自:
www.lua.org/pil/16.1.html
目的是什么:
self.__index = self
线?为什么每次创建对象时都会执行它?
正如其他人所说,self(Account表)用作分配给使用new创建的对象的元表.当在’o’中找不到字段时,稍微简化(在提供的链接上提供更多信息),它会转到’帐户’表,因为o的metatable表示转到帐户(这是__index所做的).但是,每次创建对象时都不需要执行它.你可以很容易地把它粘在某个地方:
Account.__index = Account
它也会起作用.
更长的故事是,如果对象o具有metatable,并且metatable具有__index字段集,则o上的失败字段查找将使用__index来查找字段(__ index可以是表或函数).如果o已设置字段,则不要转到其metatable的__index函数来获取信息.不过,我再次鼓励您阅读上面提供的链接.

