Object 在Lua中创建和使用对象样式模块

Object 在Lua中创建和使用对象样式模块,object,lua,Object,Lua,我一直在尝试用Lua中的一个模块来模拟一个对象。i、 我做了一副牌: local Card = require("Card") local function firstCard() Card.newDeck() Card.drawCard() return Card.getCard() end local function secondCard() Card.newDeck() Card.drawCard() return Card.getCa

我一直在尝试用Lua中的一个模块来模拟一个对象。i、 我做了一副牌:

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的了解有限,老实说,我通常只在计算或小游戏中使用它,以保持我的工作状态——我才16岁。我更习惯于Java,尽管我在学习Java之前就开始使用Lua了。我只是想知道我是否能以及如何才能让这一切顺利进行。在大多数情况下,它是有效的,只是那些偶尔出现的
nil
值。

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


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

尝试使用此方法,似乎效果不错,如果索引出现问题,它应该打印“ERROR NO VALUE”,如果出现问题(不应该),只需打印索引(在generateCard()函数中)

这就是测试

local Card = require("Card");
local function firstCard()
    Card.newDeck()
    return Card.generateCard(); -- two parameters, deck and value
end
local function secondCard()
    Card.newDeck()
    return Card.generateCard();
end
first = firstCard()
second = secondCard()
print(first)
print(second)
这是模块

local Card = {deck={};value={};};
function Card.newDeck()
    local self = Card
    local deck = self.deck;
    local value = self.value;
    local cards = {[1]="Ace",[11]="Jack",[12]="Queen",[13]="King"};
    local types = {[1]="Clubs",[2]="Diamonds",[3]="Hearts",[4]="Spades"};
    for x = 1, 13 do
        for i = 1, 4 do
            local _card,_type=(cards[x] or x),types[i];
            deck[#deck+1] = _card.." of ".._type
            value[#deck+1] = x
        end
    end
end
function Card.generateCard()
    local self = Card;
    if(not math.round) then
        math.round = function(value) local mi,ma=math.floor(value),math.ceil(value)return(mi+0.5>value and mi or ma)end;
    end
    local index = math.round(math.random(1000, 52000)/1000);
    return (self.deck[index] or "NO VALUE FOR CARD"),(self.value[index] or "NO DECK FOR CARD");
end
return Card

该死我讨厌看不到这么小的东西。谢谢^-^