lua的点和冒号的区别

lua的语法很简单,太简单了,所以lua就复杂了

两个点与一个点有什么区别呢?

一个点用来定义和取得一个变量,这个变量可能是个函数

两个点用来定义和调用一个函数,两个点会自动传入“调用者”这个table自身

先看简单的:

c = {a = 1, b = 2}

function c:foo()

  print(self.a,self.b)

end

这里,c这个table定义了一个foo函数,用两个点定义的,在foo函数第一个参数的地方自动传入了c自身,然后调用一下

c:foo()

输出1 2

也可以这样,一个点调用函数,手动传入table:c.foo(c)

输出也是一样的

下面看复杂一点的:

两个点会自动传入调用者本身,但是他仅仅只会传入调用者本身,他没有一个点灵活,这个怎么理解?看代码

c = {a = 1, b = 2}

c.foo = function(c) print(c.a,c.b) end

d = {}

d.foo2 = c.foo

d:foo2()

输出为:nil nil

解释下上面的代码:

首先创建一个table,然后定义一个函数foo,这个函数访问了table中的a和b两个变量

然后创建了另一个table,b

在b中定义一个变量foo2,赋值为c这个table中的foo函数

然后调用d这个table中的foo2函数,输出为nil nil

因为d是两个点调用的foo2,那么会自动吧d本身传入函数的第一个参数,那么函数的运行就是这样的:

function (d)

  print(d.a,d.b)

end

d这个table没有定义a和b两个变量,输入当然就是nil

像这种情况就只能一个点调用,显示的传入c这个table

d:foo2()改为d.foo2(c) 这样就可以了

输出1 2

上面的例子还可以这么写:

c = {a=1,b=2}
function c:foo()
  print(self.a,self.b)
end

d = {}
d.foo2 = c.foo

d.foo2(c)

时间: 2024-10-13 12:02:13

lua的点和冒号的区别的相关文章

LUA中点号和冒号的区别

Student = {}; Student.__index = Student; function Student:new(name, age) local temp = {}; setmetatable(temp, Student); temp.name = name; temp.age = age; return temp; end function Student:info() print(self.name, self.age); --运行stu2时会报错 -- print("name:

lua中的pairs和ipairs区别

pairs Returns three values: the next function, the table t, and nil, so that the construction for k,v in pairs(t) do body end will iterate over all key–value pairs of table t. See function next for the caveats of modifying the table during its traver

Lua中调用函数使用点号和冒号的区别

最简单的类 TSprite = { x = 0, y = 0, } function TSprite.setPosition(x, y) TSprite.x = x; TSprite.y = y; end TSprite.setPosition(1, 2); print("TSprite坐标(" .. TSprite.x .. "," .. TSprite.y .. ")"); mSprite.setPosition TSprite = { x

lua 中点和冒号的区别

1. 点和冒号的区别是, 一个是方法调用, 一个面向对象,里面有个self , 修改了原function, 不会影响到复制对象. local _M = {} function _M.one(a,b) return a + b end _M.one(1,2)  # 结果是3 local w = _M ; w.one(1,2) # 结果是3 _M  = nil w.one(1,2) # 报错 解决这个错误,所以有了: 原文地址:https://www.cnblogs.com/nika86/p/107

关于伪类选择器中一个冒号和两个冒号的区别

在平时工作中用到伪类选择器的时候一个冒号和两个冒号貌似都是可以的,所以两者到底有什么区别呢,我们先来看下W3C关于CSS3选择器的规范中有一段描述: A pseudo-element is made of two colons (::) followed by the name of the pseudo-element. This :: notation is introduced by the current document in order to establish a discrimi

CSS中一个冒号和两个冒号的区别

单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素.伪元素由双冒号和伪元素名称组成.双冒号是在css3规范中引入的,用于区分伪类和伪元素.但是伪类兼容现存样式,浏览器需要同时支持旧的伪类,比如:first-line.:first-letter.:before.:after等.对于CSS2之前已有的伪元素,比如:before,单冒号和双冒号的写法::before作用是一样的.提醒,如果你的网站只需要兼容webkit.firefox.opera等浏览器,建议对于伪元素采用双冒号的写法如果

lua中pairs和ipairs的区别

主要在有key为整数的时候有区别. 注意数组默认的下标从1开始,比如a={"a","b","c","d"},和a={[1]="a",[2]="b",[3]="c",[4]="d"}是一样的. local a = { "a","b","c","d" } for k, v

“::before”和“:before”中的双冒号和单冒号的区别

伪类 伪元素 css3 为了区分伪类和伪元素两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示.对于CSS2之前已有的伪元素,比如:before,单冒号和双冒号的写法::before作用是一样的. 你的网站只需要兼容webkit.firefox.opera等浏览器,建议对于伪元素采用双冒号的写法,如果不得不兼容IE浏览器,还是用CSS2的单冒号写法比较安全.如果自己不确定的话可以针对某些需要兼容的属性有两种属性 原文地址:https://www.cnblogs.com/yogi

Lua中ipairs和pairs的区别详解

迭代器for遍历table时,ipairs和pairs的区别: 区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去 区别二: local a = {"Hello", "World", a = 1, b = 2, x = 10, y = 20, "Good", nil, "Bye"} -- for i,v in ipairs(a) do -- print(v) -- end for k,v in pair