这两种写法有区别么
lua吧
全部回复
仅看楼主
level 4
蝉先觉💤 楼主
-- 网上的写法
MyClass = {}
MyClass.__index = MyClass
function MyClass:new(x,y)
local temp = {}
setmetatable(temp, MyClass)
temp.x = x
temp.y = y
return temp
end
function MyClass:test()
print(self.x,self.y)
end
object = MyClass:new(10,20)
object:test()
-- 我的写法
MyClass = {}
function MyClass:new(x,y)
local temp = {}
setmetatable(temp, {__index=MyClass})
temp.x = x
temp.y = y
return temp
end
function MyClass:test()
print(self.x,self.y)
end
object = MyClass:new(10,20)
object:test()
第二种写法会不会有什么缺点?
2014年07月25日 05点07分 1
level 8
没什么区别,你的还更好些
2014年07月25日 07点07分 2
多谢,我又改进了一下,在楼下
2014年07月25日 08点07分
level 4
蝉先觉💤 楼主
MyClass = {}
function MyClass:new(x,y)
local inst = {}
setmetatable(inst, {__index=self})
function inst:init()
self.x=x
self.y=y
end
inst:init()
return inst
end
function MyClass:test()
print(self.x,self.y)
end
object = MyClass:new(10,20)
object:test()
2014年07月25日 08点07分 3
level 4
蝉先觉💤 楼主
做了个实验
f=function(a,...)
return function(b, ...)
return function(...)
print(...)
end
end
end
f ("foo")("bar") "end"
看来只要返回足够的函数把参数消耗掉,最后只剩下f x(合法的函数调用), 这样就可以了
换成别的语言就语法错误了,这可能是一种“极晚检查”吧。。
2014年07月28日 07点07分 7
level 4
蝉先觉💤 楼主
2014年07月28日 07点07分 8
回复 矮番薯_爱翻书 :哈,走眼了,sorry
2014年07月28日 08点07分
level 4
蝉先觉💤 楼主
@矮番薯_爱翻书
class "Person" {
name="unknown",
__init__ = function(self,name)
self.name = name
end,
echo=function(self)
print(self.name)
end
}
p=Person()
p:echo()
我觉得这里应该输出nil,结果输出是 "unknown", 请问为啥呢?
2014年07月28日 08点07分 9
2014年07月28日 08点07分
p:echo()<==>p.echo(p)
2014年08月01日 19点08分
level 4
蝉先觉💤 楼主
@矮番薯_爱翻书
slither 这个问题有点纠结,可是又难舍它的风格,可能我有点完美主义了
本质原因,我想是因为lua没有js的undefined那样的东西(可以用来判断下标是否存在)
判断成员是否赋过值只能看是否nil(下标不存在跟元素值为nil是一回事):
js:
var t={}
alert(t.foo===undefined) // 输出true
alert(t.foo===null) // 输出false
lua:
t={}
print(t[*foo*]) -- 输出 nil
据此来判断是否存在成员赋值或重载,显得不严谨
类似之前的例子,或者下面这个:
class "Person" {
name="unknown",
...
class "Driver" "Person" {
name=nil, -- 这里起不到重载的作用
...
我能想到的办法,就是不这样声明变量,一律在 __init__ 里初始化,估计就没什么问题了
2014年07月29日 01点07分 11
lua 不区分 undefined 和 nil, http://lua-users.org/wiki/StoringNilsInTables, 第一段提到了. 另外,这里似乎有个办法解决,正在看
2014年07月29日 02点07分
下标不存在跟取到nil是一回事(如果不考虑元方法) 对某个对象赋nil值的语义就是删除它
2014年07月30日 03点07分
回复 霞虫 :嗯没看完就回复了 无视吧
2014年07月30日 03点07分
回复 霞虫 :是的,上面的链接里提到了这跟其它语言不一样
2014年07月30日 03点07分
level 4
蝉先觉💤 楼主
@矮番薯_爱翻书
受文章启发,我觉得这样就比较完美了 [滑稽]
require *slither*
undefined=nil
null=setmetatable({}, {__tostring=function() return "null" end})
function isnull(l)
return not not #l
end
print(null)
print(isnull(null))
class "Person" {
name="unknown",
__init__ = function(self,name)
if(name==nil) then name=null end
self.name = name
end,
echo=function(self)
print(self.name,Person.name)
end
}
p=Person()
p:echo()
class "Driver" "Person" {
name=null,
echo=function(self)
print("driver",self.name)
end
}
p=Driver()
p:echo()
2014年07月29日 02点07分 12
level 11
从内存上看,第二种写法要多占用内存;从设计思路上看,第二种写法完全违背了类抽象的特点,完全为每个实例做出自己的定义。第二种写法没有可取之处。
2014年08月01日 19点08分 14
还真没想到这一层面, 只想到是为了查找成员, 第二种写法,如果改成 __index=self 才是查找每个实例吧
2014年08月01日 23点08分
回复 madpc :查找实例的成员没有意义,那不如别用类了
2014年08月02日 02点08分
回复 madpc :类的概念就是抽像实例,实例如果跟类不一样,那类就没意义了
2014年08月02日 02点08分
回复 cruzeflute :但我的例子不是查找实例吧
2014年08月02日 03点08分
1