我一直在尝试在 Lua 中使用一个模块并用它来模仿一个对象。即我做了一副纸牌:

local Card = require("Card")

local function firstCard()
    Card.newDeck()
    Card.drawCard()
    return Card.getCard()
end

local function secondCard()
    Card.newDeck()
    Card.drawCard()
    return Card.getCard()
end

first = firstCard()
second = secondCard()

print(first)
print(second)

我设置了 first = firstCard()second = secondCard() 但是当我打印这两个变量时 second 偶尔会结果为 nil 。老实说,我迷路了。这是实际的模块本身。
local Card = {}

local deck
local value
local number, suit
local index = 0
local getCard
local getValue

function Card.newDeck()
   deck = {}
   value = {}
   for x = 1, 13 do
      if x == 1 then
         number = "Ace"
      elseif x == 11 then
         number = "Jack"
      elseif x == 12 then
         number = "Queen"
      elseif x == 13 then
         number = "King"
      else
         number = x
      end
      for x1 = 1, 4 do
         if x1 == 1 then
            suit = "Clubs"
         elseif x1 == 2 then
            suit = "Diamonds"
         elseif x1 == 3 then
            suit = "Hearts"
         else
            suit = "Spades"
         end
         index = index + 1
         deck[index] = number.." of "..suit
         value[index] = x
      end
   end
end

function Card.drawCard()
   index = math.random(52)
   getCard = deck[index]
   getValue = value[index]
end

function Card.getCard()
   return getCard
end

function Card.getValue()
   return getValue
end

function Card.getIndex()
   return index
end

return Card

在面向对象编程方面,我对 Lua 的了解有限,老实说,我通常只将它用于计算或小游戏,以保持忙碌。我是类(class) - 我只有 16 岁。我更习惯Java,尽管我在学习 Java 之前就开始很好地使用 Lua。我只想知道我是否以及如何使这项工作发挥作用。在大多数情况下它是有效的,只是那些偶尔的 nil 值。

最佳答案

问题是您已经在模块的顶层声明了局部变量 index。这意味着您在第一个 index 中计算的 drawCard() 的随机值将在您对 newDeck() 的第二次调用中重用。您可以在 print(index) 的开头添加 newDeck() 以了解我的意思。

有几种方法可以解决这个问题。一种是在 index = 0 的顶部添加 newDeck() 。更好的方法是用较小的范围声明变量,即使 index 对每个使用它的函数都是局部的。

关于object - 在 Lua 中制作和使用对象样式的模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27450712/

10-11 22:40
查看更多