网上帖子太多了,看了好多,真是剪不断,理还乱。。。。
先说明一下self是在使用冒号":"是才有的关键字,就是说点号"."不起作用。
先上代码:
tab={
value="第一个值"
}
--现在我们想通过方法打印tab的valua值
function tab.pr(t) --在tab中定义点号的方法pr()
print(t.value);
end
--然后我们调用方法
tab.pr(tab); --要传入参数
输出:
第一个值
调用tab的方法pr()并将tab参数传进去
这样写不够简练,可以将参数省略,即使用冒号
改写方法为冒号。
function tab:pr() --在tab中定义冒号的方法pr()
print(self.value); --不需要传入参数,使用冒号将会自动传入包含pr()方法的tab,并必须通过self接受(self只有使用冒号时才是关键字)
end
然后我们调用方法
tab:pr()
输出:
上面效果都是一样的。只不过一个是传入参数(包含pr()方法的tab),一个使用默认隐藏参数(包含pr()方法的tab)
上面出现self关键字,下面我将说明self的使用和点号和冒号的混合使用以帮助更好的理解
一.使用冒号方法调用调号方法
先上代码:
tab={
value="第一个值"
}
function tab.pr(t) --在tab中定义点号的方法pr()
print(t.value);
end
--现在我们使用冒号调用此方法
输出
第一个值
下面修改print的传入参数t为self
tab={
value="第一个值"
}
function tab.pr(t) --在tab中定义点号的方法pr()
print(self.value);
end
--现在我们使用冒号调用此方法
此时将会报错,因为self在点号方法中不是关键字,上面我已经解释。
二.使用点号方法调用冒号方法
tab={
value="第一个值"
}
function tab:pr() --在tab中定义冒号的方法pr()
print(self.value);
end
--现在我们使用点号调用此方法
再看:
tab={
value="第一个值"
}
function tab:pr() --在tab中定义冒号的方法pr()
print(self.value);
end
--现在我们使用点号调用此方法
此时报错,因为点号调用没有传入参数。冒号中的self将默认为nil,所以报错
当然如果冒号方法没有使用self关键字,点号方法就不用传入参数
tab={
value="第一个值"
}
function tab:pr() --在tab中定义冒号的方法pr()
print(tab.value);
end
--现在我们使用点号调用此方法
tab={
value="第一个值"
}
function tab:pr() --在tab中定义冒号的方法pr()
print(tab.value);
end
--现在我们使用点号调用此方法
需要注意的是,点号方法调用冒号方法时,参数可以是非包含此方法的table的其他任意参数,self调用的是传入的第一个参数
other={
aa="第一个值"
}
function tab:pr() --在tab中定义冒号的方法pr()
print(self.aa);
tab.pr(other);---非包含此方法的table的其他任意参数