我一直在制作一款卡牌游戏,可以获得你的套牌,并选择三张牌中的一张,但每当我尝试运行它时,它都会给我一个错误
错误:
Error: In call to CPUser::addCards(), was given too many arguments; it expects 1 at Server/CPUser.pm line 427.
第427行:
if($intItem == 821){ #Adds Card Jitsu Cards for Classic
$self->addCards($self->buildStarterDeck);
}
这就是buildStarterDeck方法
method buildStarterDeck {
sub get_cards;
my (@stackone, @stacktwo) = get_cards;
sub get_cards
{
my @start_cards = (1, 6, 9, 14, 17, 20, 22, 23, 26);
my @power_cards = (73, 81, 89);
@power_cards = $power_cards[rand @power_cards];
return (@start_cards, @power_cards);
}
}
addCard方法是空的,因为我一直在试图找出这个错误而且我没有运气。
答案 0 :(得分:4)
问题在于您对addCards
的定义,尽管有多个请求要求我们保留这些内容。它必须看起来像这样
method addCards($param) {
...;
}
但是你在$self->addCards($self->buildStarterDeck)
中传递了一个十元素列表,因此引发了given too many arguments
错误。你没有解释你想要它做什么,但这样的事情可能更合适
method addCards(@cards) {
...;
}
你真的不应该在其他子程序中声明子程序。它不限制内部子例程的范围,但是您可以在外部子例程中声明的无法正常工作的变量上创建闭包
同时请注意评论中的zdim's warning,您的代码应该更像这样
use strict;
use warnings 'all';
use Method::Signatures;
method buildStarterDeck {
my @stack = get_cards;
}
sub get_cards {
my @start_cards = (1, 6, 9, 14, 17, 20, 22, 23, 26);
my @power_cards = (73, 81, 89);
$power_card = $power_cards[rand @power_cards];
return (@start_cards, $power_card);
}