Lua中“.”调用方法与“:”调用方法的区别

Lua中“.”调用方法与“:”调用方法的区别:                                                                                                                        

一、概述

学lua的时候有一个迷惑点,就是搞不清楚‘.’与‘:’调用方法的区别,今天很早就起来看了看一个大牛的视频讲解,才顿悟了:‘.’调用和‘:’实际是传递参数的个数不同而已,‘:’实际是一个语法糖。

二、演示

 1 require"members"
 2 require"player"
 3 require"guns"
 4 require"function"
 5
 6 local tom=Player.New()   --新建一个tom的 player
 7
 8 tom.name="Tom"           --将tom的名字赋值为"Tom"
 9
10 print(tom.name,tom.life) --打印tom的name tom的life
11
12 local doris=Player.New() --新建一个”doris" 的player
13
14 doris.name="Doris"       --将doris的名字赋值为“Doris”
15
16 for k,v in pairs(Guns) do   --在Guns中遍历attack==20的武器,找到后将tom的武器赋值为v,跳出循环
17     if v.attack==20 then
18         tom.weapon=v
19         break
20     end
21 end
22
23 print("tom‘s weapon :",tom.weapon.name)    --打印出“tom‘s weapon:” tom.weapon.name
24
25 --tom -> meta table -> __index -> "Attack" field or method
26 --这里传递了两个参数  tom:Attack(self->doris,var->attack)
27 tom:Attack(doris)                        --tom:attack(doris) . 和 : 调用有所不同   .只是调用它方法  :调用 还可以访问到tom本身的属性
28
29 --这里传递1个参数  tom:Attack(var->attack)
30 tom.Attack1(doris)                        --tom:attack(doris) . 和 : 调用有所不同
31 print("doris life",doris.life)           --打印攻击完了后doris的生命值
 1 Player={}                                        --新建一个player的表
 2
 3 Player.__index=Player                            --共享player的数据
 4
 5 function Player.New()                            --player的new()方法
 6
 7     local obj={name="unkown",life=100}
 8
 9     setmetatable(obj,Player)
10
11     return obj                                   --返回obj={name="unkown",life=100} &&  plyer的属性:Attack
12 end
13
14 --这里的冒号传递了两个参数 Player:Attack(self->tom,var->target)
15 function Player:Attack(target)
16
17     print("attack",target.name)                  --打印("attack",target.name)
18
19     --this ptr
20     target.life=target.life-self.weapon.attack   --目标的生命值=目标生命值-self.weapon.attack       self=tom
21
22 end
23
24
25 --这里的冒号传递了一个参数 Player:Attack1(var->target)
26 function Player.Attack1(target)
27
28     print("attack",target.name)                  --打印("attack",target.name)
29
30     --this ptr
31     target.life=target.life-self.weapon.attack   --目标的生命值=目标生命值-self.weapon.attack       self=tom
32
33 end
时间: 2024-08-06 20:07:57

Lua中“.”调用方法与“:”调用方法的区别的相关文章

Lua语言基础汇总(8) -- Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那本文就是主要讲的是如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接

[转]Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如果定义这个指定的函数,这个指定的函数时什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

Lua中..和#运算符的使用方法

Lua中..和#运算符的使用方法 例子 试试下面的例子就明白了在Lua编程语言提供的其他运算符: a = "Hello " b = "World" print("Concatenation of string a with b is ", a..b ) print("Length of b is ",#b ) print("Length of b is ",#"Test" ) 当建立并执

Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

Lua中的模块以及实现方法

从使用的角度来看,一个模块就是一个程序库,可以通过Lua自身提供的require来加载.然后便得到一个全局变量,表示一个table.这个table就是像一个名字空间,其内容就是模块导出的所有东西,例如函数和常量.简单的说,Lua中的模块就是一个table,table中可以包括任何东西.本文首先详细介绍模块相关的require函数,包括该函数的执行流程以及查找模块的路径,然后介绍了实现模块的三种方法,并给出相应的优缺点. require函数 该函数用来加载一个模块,即按指定的路径和传入的参数,查找

在lua中正确使用uuid的方法:

local uuid = require "resty.uuid"; -- 参考:http://blog.csdn.net/zhangxaochen/article/details/8095007-- 参考:http://zivn.me/?p=157 uuid.randomseed(tostring(ngx.time()):reverse():sub(1, 6)); local webfile_id = uuid(); uuid.randomseed(tostring(ngx.time

Lua中字符串类型的源码实现

    概述 Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0.也就是说,可以将任意二进制数据存储到一个字符串中.Lua的字符串是不可变的值(immutable values).如果修改,实质上是新建一个字符串.根据上文<Lua中数据类型的源码实现>中知道,在Lua中,字符串是自动内存管理机制所管理的对象,并且由联合体TString来实现存储字符串值的.下面将通过Lua 5.2.1的源码来看字符串的实现以及总结了在Lua中使用字符串的注意事项.     源码实现 首

Lua语言基础汇总(10) -- Lua中的环境概念

前言 Lua将其所有的全局变量保存在一个常规的table中,这个table称为“环境”.这种组织结构的优点在于,其一,不需要再为全局变量创造一种新的数据结构,因此简化了Lua的内部实现:另一个优点是,可以像其他table一样操作这个table.为了便于实施这种操作,Lua将环境table自身保存在一个全局变量_G中.例如,我们可以使用以下代码打印当前环境中所有全局变量的名称. 1 for n in pairs(_G) do print(n) end 在你的电脑上运行一下以上代码,看看结果. 全局

Lua语言基础汇总(9)-- Lua中__index和__newindex实践

前言 本文将通过几个简单的实例演示,巩固对__index和__newindex的理解,同时加深对Lua中元表和元方法的理解,如果对Lua的元表和元方法还不是很熟悉的话,请参考这篇文章:<Lua中的元表与元方法>. 具有默认值的table 我们都知道,table中的任何字段的默认值都是nil,但是通过元表,我们可以很容易的修改这一规定,代码如下: 1 2 3 4 5 6 7 8 9 function setDefault(tb, defaultValue)      local mt = {__

lua中for循环的四种遍历方式

lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3 key,value pairs 取每一个键值对 ipairs 取从key==1开始的顺序整数最大值,每个键值对 参考http://rangercyh.blog.51cto.com/1444712/1032925 不过有一个问题, tbtest = { [1] = 1, [2] = 2, [4] = 4, } print(#(tbtest))