Как правильно передать переменную в и из вызываемой функции? - PullRequest
0 голосов
/ 02 апреля 2019

Я реализовал класс с именем cell и пытаюсь сохранить в нем символ. Я обнаружил, что существует проблема с извлечением символа с помощью моего сеттера и геттера.

#This is the detail of the class:      
package Cell;
sub new{
  my $class = shift;
  my $self = {  
    content => -1,
  };
  return bless $self, $class;
}

#This is my setter and getter  
sub setContent{
  my ($self,$ch) = @_;
  $self->{content} = $ch;
  print("stored char".$self->{content}."\n");
} 

sub getContent{
  my $self = @_;
  print("passing back char".$self->{content}."\n");
  return $self->{content};  
} 

# this is the way i used the class
my $ch = "a";
my $cell = Cell->new();
$cell->setContent($ch);     
my $testvar = $cell->getContent();
print("test start\n".$testvar);
print("test end\n");
#

Я нахожу, что могу передать char в установщик и должен быть сохранен в $ self -> {content}, но при попытке извлечь char с помощью getter $ self -> {content} становится пустым

1 Ответ

3 голосов
/ 02 апреля 2019

Единственная прямая ошибка - строка в вашем методе "getter" getContent:

my $self = @_;  # assigns number of elements in the array to $self!

Это пытается присвоить массив скаляру, что не имеет смысла в его нынешнем виде.Вместо этого выполняется вычисление массива по количеству его элементов, а присваивается $self.Таким образом, в остальной части метода нет объекта в $self, а только число, здесь 1.

Если вы включили предупреждения через use warnings; в верхней части программы, вы получите

Невозможно использовать строку ("1")как ссылка HASH, в то время как «строгие ссылки» используются в ...

для строки, где вы пытаетесь вызвать метод на $self, сообщая, что ожидаемый объект (hashref) находится вфакт строка.Это дает вам точную строку и информативное, если кратко, диагностическое сообщение .Без включенных предупреждений код спокойно продолжается, но не может работать как ожидалось.

Мораль: Пожалуйста, всегда имейте use warningsuse strict) в начале

Исправление состоит в том, чтобы сделать это «списком присваивания» - присваивать в списке «контекст»

my ($self) = @_;

, где контекст списка накладывается на оператор присваивания = с помощью (...) налевая сторона.Теперь элементы в массиве @_ назначаются переменным, перечисленным в (), один за одним.Здесь есть только одна переменная на LHS ($self), поэтому ему присваивается первый элемент @_, а остальные, если они были, отбрасываются.

Или назначьте один элемент@_ до $self в скалярном назначении.В объектно-ориентированном коде это часто делается с использованием shift , поэтому для дальнейшего удобства также необходимо удалить объект из списка аргументов

my $self = shift;

, где shift в подпрограмме по умолчанию работает на@_.

См. context и Scalar vs Оператор присвоения списка .

Я бы рекомендовал всегда писать класс в своем собственном .pm файле, который затем use d в программе.Об обработке ошибок в пакетах см. Carp .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...