博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua-面向对象中函数使用时冒号(:)和点(.)的区别
阅读量:5039 次
发布时间:2019-06-12

本文共 1678 字,大约阅读时间需要 5 分钟。

 

先来看一段简单的代码:

local Animal = {}function Animal:Eat( food )    print("Animal:Eat", self, food)endfunction Animal.Sleep( time )    print("Animal.Sleep", self, time)endAnimal:Eat("grass")Animal.Eat("grass")Animal:Sleep(1)Animal.Sleep(1)

输出结果为:

Animal:Eat table: 0x7f8421c07540 grassAnimal:Eat    grass    nilAnimal.Sleep    nil    table: 0x7f8421c07540Animal.Sleep    nil    1

 

 

由此可见,

定义:
在Eat(冒号函数)内部有一个参数self,在Sleep(点函数)内部没有参数self;
调用:
用冒号(:)调用函数时,会默认传一个值(调用者自身)作为第一个参数;
用点(.)调用函数时,则没有;

-- 如果要使结果一致,则:

Animal:Eat("grass")Animal.Eat(Animal,"grass")Animal:Sleep()Animal.Sleep(Animal)

 

输出结果:

Animal:Eat    table: 0x7f8421c07540    grassAnimal:Eat    table: 0x7f8421c07540    grassAnimal.Sleep    nil    table: 0x7f8421c07540Animal.Sleep    nil    table: 0x7f8421c07540

 

 

-- 我们为什么可以用.和:来定义函数

function Animal.Sleep( time ) end
-- 这种写法是一种(syntactic sugar),它的原型是:
Animal.Sleep = function ( time ) end

 

用双冒号(:)时,也是一种语法糖,实际上默认传递一个self(Animal)参数:

function Animal:Eat( food ) end
等价于
function Animal.Eat( self, food ) end

 

可参考Lua函数定义:

3.4.10 – Function Definitions

The syntax for function definition is

functiondef ::= function funcbody	funcbody ::= ‘(’ [parlist] ‘)’ block end

The following syntactic sugar simplifies function definitions:

stat ::= function funcname funcbody	stat ::= local function Name funcbody	funcname ::= Name {‘.’ Name} [‘:’ Name]

The statement

function f () body end

translates to

f = function () body end

The statement

function t.a.b.c.f () body end

translates to

t.a.b.c.f = function () body end

The statement

local function f () body end

translates to

local f; f = function () body end

not to

local f = function () body end

 

转载于:https://www.cnblogs.com/zzya/p/5778119.html

你可能感兴趣的文章
android圆角View实现及不同版本号这间的兼容
查看>>
OA项目设计的能力③
查看>>
Cocos2d-x3.0 文件处理
查看>>
全面整理的C++面试题
查看>>
Web前端从入门到精通-9 css简介——盒模型1
查看>>
Activity和Fragment生命周期对比
查看>>
OAuth和OpenID的区别
查看>>
android 分辨率自适应
查看>>
查找 EXC_BAD_ACCESS 问题根源的方法
查看>>
国外媒体推荐的5款当地Passbook通行证制作工具
查看>>
日常报错
查看>>
list-style-type -- 定义列表样式
查看>>
hibernate生成表时,有的表可以生成,有的却不可以 2014-03-21 21:28 244人阅读 ...
查看>>
mysql-1045(28000)错误
查看>>
Ubuntu 编译出现 ISO C++ 2011 不支持的解决办法
查看>>
1.jstl c 标签实现判断功能
查看>>
Linux 常用命令——cat, tac, nl, more, less, head, tail, od
查看>>
超详细的Guava RateLimiter限流原理解析
查看>>
VueJS ElementUI el-table 的 formatter 和 scope template 不能同时存在
查看>>
Halcon一日一练:图像拼接技术
查看>>