如何在Lua中实现OO? [英] How can one implement OO in Lua?

查看:84
本文介绍了如何在Lua中实现OO?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Lua没有对OO的内置支持,但是它允许您自己构建.您能否分享一些实现OO的方法?

Lua does not have build in support for OO, but it allows you to build it yourself. Could you please share some of the ways one can implement OO?

请为每个答案写一个例子.如果您有更多示例,请发布另一个答案.

Please write one example per answer. If you have more examples, post another answer.

推荐答案

我喜欢将OOP看作是将数据封装在容器(对象)中,再加上可以处理此数据的一部分操作.还有很多东西,但是让我们假设这个简单的定义就是全部,并可以在Lua中构建一些东西(对其他OO实现的一些熟悉也可以为读者带来很多帮助).

I like to think of OOP as being the encapsulation of data inside a container (the Object) coupled with a subset of operations that can be done with this data. There IS a lot more to it, but let's assume that this simple definition is all and build something in Lua from it (also some familiarity with other OO implementations can be a nice boost for the reader).

几乎不接触Lua的人都可能知道,表是存储键值对并与字符串结合使用的一种巧妙方法,事情开始变得非常有趣:

As anyone with a little exposure to Lua may know, tables are a neat way to store key-value pairs and in combination with strings, things start to become very interesting:

local obj = {} -- a new table
obj["name"] = "John"
obj["age"] = 20
-- but there's a shortcut!
print("A person: " .. obj.name .. " of the age " .. obj.age)

作为表中键的字符串值可以用与C中的结构成员或C ++/Java和类似语言中的对象的公共成员非常相似的方式访问.

String values as keys in a table can be accessed in a way very alike to the members of a struct in C or the public members of an object in C++/Java and similar languages.

现在有了一个很酷的魔术:让我们将其与匿名函数结合起来.

And now for a cool magic trick: let's combine this with anonymous functions.

-- assume the obj from last example
obj.hello = function () 
   print("Hello!")
end

obj.goodbye = function ()
   print("I must be going.")
end

obj.hello()
obj.goodbye()

太棒了吧?现在,我们有了将函数存储在表中的方法,并且您可以再次看到它类似于在其他OOP语言中使用方法的方式.但是缺少了一些东西.我们如何在方法定义内访问属于我们对象的数据?通常可以通过将表中函数的签名更改为以下内容来解决此问题:

Awesome right? We now have means of having functions stored inside our tables, and again you can see it resembles how methods are used in other OOP languages. But something is missing. How can we access the data that belongs to our object inside our method definitions? This is generally addressed by changing the signature of the functions in the table to something like this:

-- assume the obj from last example
obj.inspect = function (self)
   print("A person: " .. self.name .. " of the age " .. self.age)
end

obj.hello = function (self) 
   print(self.name .. ": Hello! I'm " .. self.name)
end

obj.goodbye = function (self)
   print(self.name .. ": I must be going.")
end

-- now it receives the calling object as the first parameter
obj.inspect(obj) -- A person: John of age 20
obj.hello(obj) -- John: Hello! I'm John
obj.goodbye(obj) -- John: I must be going

以一种简单的方式解决了它.也许与Python中的工作方式(方法总是获得显式的自我)相提并论可以帮助您了解Lua中的工作方式.但是,男孩,在我们的方法调用中显式传递所有这些对象是否不方便?是的,这也困扰着我,因此还有另一个捷径可以帮助您使用OOP:

That solves it in a simple manner. Maybe drawing a parallel to the way things work in Python (methods always get a explicit self) can aid you in learning how this works in Lua. But boy, isn't it inconvenient to be passing all these objects explicitly in our method calls? Yeah it bothers me too, so there's another shortcut to aid you in the use of OOP:

obj:hello() -- is the same as obj.hello(obj)

最后,我只是从头开始了解如何完成此操作.如 Kevin Vermeer的评论所述, Lua用户Wiki 是有关此主题的极好的信息来源,您可以在那里学习有关如何实现此答案中已被忽略的OOP的另一个重要方面(私有成员,如何构造对象,继承等).请记住,这种处事方式只是Lua哲学的一小部分,它为您提供了能够构建更高级构造的简单正交工具.

Finally, I have just scratched the surface of how this can be done. As has been noted in Kevin Vermeer's comment, the Lua Users Wiki is an excellent source of information about this topic and there you can learn all about how to implement another important aspects of OOP that have been neglected in this answer (private members, how to construct objects, inheritance, ...). Have in mind that this way of doing things is a little part of the Lua philosophy, giving you simple orthogonal tools capable of building more advanced constructs.

这篇关于如何在Lua中实现OO?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆