让 Lua 变成面向对象语言的技巧

Lua 不是一种面向对象的编程语言。这里有一个技巧可以使用 Lua 表来代替面向对象的类。
还没有读者喜欢这篇文章。
Woman sitting in front of her laptop

kris krüg

Lua 不是一种面向对象的编程语言,而是一种利用 C 函数和类似 C 语法的脚本语言。 但是,您可以在 Lua 代码中使用一个很酷的技巧,使 Lua 在您需要时表现得像面向对象的语言。 关键在于 Lua 的结构,本文演示了如何使用 Lua 表来代替面向对象的类。

什么是面向对象编程?

术语“面向对象”本质上是一种描述模板系统的花哨方式。 想象一下,您正在编程一个应用程序,以帮助用户在僵尸末日期间发现和记录僵尸。 您正在使用面向对象的语言,例如 C ++,JavaPython。 您需要创建代码对象来表示不同类型的僵尸,以便用户可以将它们拖动并放置在城市地图上。 当然,僵尸可以是任何事物:休眠的,慢速的,快速的,饥饿的,贪婪的等等。 这只是文本数据,计算机擅长跟踪,并且基于该数据,您甚至可以为虚拟“对象”分配一个图形,以便用户可以识别每个小部件代表的僵尸的大致类型。

对于如何解决应用程序的此需求,您有几种选择

  • 强迫您的用户学习如何编写代码,以便他们可以将自己的僵尸编程到您的应用程序中

  • 花费您余生的时间将每种可能的僵尸编程到您的应用程序中

  • 使用代码模板定义僵尸对象的属性,允许您的用户根据他们实际发现的僵尸来创建他们需要的项目

显然,唯一现实的选择是最后一个,它使用一种称为的编程构造来完成。 这是一个类的外观(此示例恰好是 Java 代码,但是概念在所有面向对象的语言中都是相同的)

public class Zombie {
  int height;
  int weight;
  String speed;
  String location;
}

无论您是否理解代码,您可能都可以看出这本质上是一个模板。 它声明,当创建一个虚拟“对象”来表示僵尸时,编程语言将为该对象分配四个属性(两个整数分别代表身高和体重,两个单词分别代表移动速度和物理位置)。 当用户单击(假想的)应用程序中的 添加项目 按钮时,该类将用作模板(在编程中,他们说“已创建一个新实例”),以分配用户输入的值。 只需一个类,就可以拥有无限的僵尸。 这是面向对象编程的力量之一。

Lua 表

在 Lua 中,是一种实现关联数组的数据类型。 您可以将 Lua 中的表视为数据库。 这是一个索引信息的存储库,您可以使用特殊的语法来调用它。 这是一个非常简单的例子

example = {}

example.greeting = "hello"
example.space = " "
example.subject = "world"

print(example.greeting ..
  example.space ..
  example.subject)

运行示例代码以查看结果

$ lua ./example.lua
hello world

从示例代码可以看出,表本质上是一堆保存在单个集合(“表”)中的键和值。

Lua 元表

元表是一个充当表模板的表。 您可以将任何表指定为元表,然后像对待其他语言中的类一样对待它。

这是一个定义僵尸的元表

Zombie = {}

function Zombie.init(h,w,s,l)
  local self = setmetatable({}, Zombie)
  self.height = h
  self.weight = w
  self.speed = s
  self.location = l
  return self
end

-- use the metatable

function setup()
  z1 = Zombie.init(176,50,'slow','Forbes & Murray Avenue')
end

function run()
  print(z1.location .. ": " ..
  z1.height .. " cm, " .. z1.weight .. " kg, " .. z1.speed)
end

setup()
run()

为了将我的元表与普通表区分开,我将元表名称的第一个字母大写。 这不是必需的,但我发现这是一个有用的约定。

这是示例代码的结果

$ lua ./zombie.lua
Forbes & Murray Avenue: 176 cm, 50 kg, slow

此演示并不能完全体现元表的优势,因为示例代码仅创建了一个没有用户交互的对象。 为了使用元表来解决仅从一个元表创建无限项的问题,您将改为编写一个用户输入函数(使用 Lua 的 io.read() 函数)来要求用户提供他们发现的僵尸的详细信息。 您甚至可能会编写一个带有“新发现”按钮的用户界面,或者类似的东西。 但是,这超出了本文的范围,只会使示例代码复杂化。

创建元表

要记住的重要一点是,要创建元表,请使用以下语法

Example = {}

function Example.init(args)
  local self = setmetatable({}, Example)
  self.key = value
  return self
end

使用元表

要使用已创建的元表,请使用以下语法

my_instance = Example.init("required args")

面向对象的 Lua

Lua 不是面向对象的,但是它的表机制使处理,跟踪和排序数据变得尽可能简单。 毫不夸张地说,一旦您熟悉 Lua 中的表,您就可以自信地说,您至少了解了该语言的一半。 您可以将表(以及扩展名,元表)用作数组,映射,便捷的变量组织,足够接近的类等等。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客,自由文化倡导者,独立的多媒体艺术家和 D& D 书呆子。 他曾在电影和计算行业工作,通常同时进行。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.