Lua-面向对象中函数使用时冒号(:)和点(.)的区别

先来看一段简单的代码:

local Animal = {}

function Animal:Eat( food )
    print("Animal:Eat", self, food)
end

function Animal.Sleep( time )
    print("Animal.Sleep", self, time)
end

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

输出结果为:

Animal:Eat table: 0x7f8421c07540 grass
Animal:Eat    grass    nil
Animal.Sleep    nil    table: 0x7f8421c07540
Animal.Sleep    nil    1

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

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

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

输出结果:

Animal:Eat    table: 0x7f8421c07540    grass
Animal:Eat    table: 0x7f8421c07540    grass
Animal.Sleep    nil    table: 0x7f8421c07540
Animal.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函数定义:

http://www.lua.org/manual/5.2/manual.html#pdf-next

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
时间: 2024-11-05 11:33:53

Lua-面向对象中函数使用时冒号(:)和点(.)的区别的相关文章

getContext在谷歌浏览器中,使用时要先加载canvas对象,否则会提示'getContext is null'

<body> <canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <script type="text/javascript">

time.h文件中包含的几个函数使用时须注意事项

time.h头文件中包含以下函数 char* asctime(const struct tm *tm); char* asctime_r(const struct tm *tm,char *buf); char* ctime(const time_t *timep); char* ctime_r(const time_t *timep,char *buf); struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const tim

LUA table中函数的调用

1 lua中函数作为表中元素时有三种定义方式 采用':'来定义,实际上隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self 2 调用方式,点号和冒号 functb:hello1()functb.hello2() 总结起来就是带:号调用表的函数时,会把表赋值给self,这样函数体里面可以直接使用self访问表的数据

LUA脚本中的方法使用冒号和点,以及调用者使用冒号和点

1.Lua脚本里方法之前的冒号和点: 备注:每个方法前面如果是冒号,则这个方法里面自带一个self属性,也就是这个LUA脚本自己类对象的self,当为点时,自带的self属性则为nil 调用者:local zwt = require "ZWTestLuaScript1" 被调者:ZWTestLuaScript1脚本中的方法如下: 方法1: function ZWTestLuaScript1:OnSumbitBtnLogin(x,y) print(self) print(x) print

scanf函数使用时忘记在变量前加上&amp;

scanf("%d%d%d",year,month,date); 忘记在year,month,date前少了&后,程序运行会没有输出,调试时会出现“Program received signal SIGSEGV, Segmentation fault.”错误: 原文地址:https://www.cnblogs.com/arthur-f/p/11448206.html

java面向对象中的方法重载与方法重写的区别

一.方法重载(overload) a:一个类中允许声明多个方法 b:一个类中允许有多个方法名称一样,但是参数不同的多个方法.通过参数不同来区别不同的方法. 参数不同表现为: 1:参数个数不同 2:参数类型不同 3:参数类型的顺序不同也是参数类型不同 4:在参数类型一样的情况下,名称不一样不代表参数不一样 重载方法的调用: 1:根据调用的时候实际参数来判断到底调用的是哪一方法 2:根据参数的要求,严格匹配传入的对应类型 3:如果严格匹配不到的话,默认遵循就近匹配 4:根据数据默认转换的顺序就近匹配

lua二进制操作函数

由于 Lua 脚本语言本身不支持对数字的二进制操作(例如 与,或,非 等操作),MUSHclient 为此提供了一套专门用于二进制操作的函数,它们都定义在一个“bit”表中,使用时只要requre “bit”即可. bit.ashr - 带符号的按位右移 此函数需要两个整数作为参数.第一个参数可以带有符号,是被以为的数,第二个参数是一个无符号整数,是向右移动的位数.在以为过程中,第一个参数的符合始终会被保留. 例如: print (bit.ashr (-1024, 6)) --> -16 bit

关于pthread_join函数在使用时如何不阻塞主线程的一种探索

pthread_join 函数是会阻塞主线程的,这会让很多java程序员不适应.因为在java中 start以后一个线程就执行执行了.主线程不会被阻塞. 而在linux中 join是会阻塞的. 那么如何使用join的时候 不阻塞主线程呢.我给出了一个解决方法. #include <stdio.h> #include <pthread.h> void *print_count(int c); void thread_start(); int main(int argc, char c

lua 中的点、冒号与self

[lua 中的点.冒号与self] lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号调用. girl = {money = 200} function girl.goToMarket(girl ,someMoney) girl.money = girl.money - someMoney end girl.goToMarket(girl ,100) print(girl.money) 上面进行了方法的点号定义和点号调用. boy = {money = 200} functi