Создать класса стека и назначить ему методы
Хочу создать класс - MyClass, который по сути будет являться классом стека. И назначить ему методы. Пытаюсь реализовать хотя бы push. Код файла скрипта:
use 5.32.1;
use strict;
use warnings;
BEGIN {
require 'MyClass.pm';
}
use MyClass;
# создаем новый объект
# в конструктор можно было передать дополнительные аргументы
# которые шли бы в sub new() следом за именем класса
my $cl = MyClass->new({stack => (20, 40, 60, 70), item => (80, 100)});
print $cl->push_onto_stack();
Код файла модуля MyClass.pm (в котором хранится класс стека):
use 5.32.1;
package MyClass; {
use strict;
use warnings;
my $stack_size = 20;
my @stack;
sub new {
# получаем имя класса
my($class, $args) = @_;
# создаем хэш, содержащий свойства объекта
my $self = bless { stack => $args->{stack},
item => $args->{item}
}, $class;
}
# метод push_onto_stack();
sub push_onto_stack {
my $self = shift;
die "Overflow\n" if {stack} > 20;
return push ({stack}, {item});
}
}
1; # ok!
Пока что при исполнении файла скрипта возвращает мне - 1. А метод не работает. Битый день не могу врубиться что не так. Помогите, пожалуйста.
Ответы (1 шт):
Автор решения: Infarch
→ Ссылка
Я еще немного всмотрелся в ваш код и понял что там все слишком запутано чтоб коментировать каждый момент. Поэтому вот рабочий пример, а вы сравните со своей версией
test.pl
use strict;
use warnings;
use MyClass;
my $cl = MyClass->new();
print $cl->push_onto_stack(10);
print "\n";
print $cl->push_onto_stack(20);
MyClass.pm
package MyClass;
use strict;
use warnings;
my $stack_size = 20;
sub new {
my($class) = @_;
my $self = {
stack => []
};
return bless $self, $class;
}
# returns the number of elements in the stack
sub push_onto_stack {
my ($self, $item) = @_;
die "Overflow\n" if @{$self->{stack}} > $stack_size;
return push @{$self->{stack}}, $item;
}
1;