Object 在Lua中创建和使用对象样式模块
我一直在尝试用Lua中的一个模块来模拟一个对象。i、 我做了一副牌: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
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
该死我讨厌看不到这么小的东西。谢谢^-^