Perl - значение объекта не сохранено - PullRequest
1 голос
/ 25 мая 2010

Попытка освоить использование ООП в Perl. Моя проблема заключается в том, что я устанавливаю переменную в классе, но значение теряется, когда я пытаюсь получить его. Я уверен, что проблема очевидна, но мне нужны дополнительные глаза.

Конструктор:

sub new
{
    my ($class, $name) = @_;
    my $self = {
        _name => $name,
        _times => []
    };
    bless ($self, $class);
    return $self;
}

метод доступа / мутатора:

sub times {
    my ($self) = shift;
    if (@_) { @{$self->{_times}} = shift }
    print "times size: " . @{$self->{_times}} . "\n";
    return @{$self->{_times}};
}

звонок из основной программы:

$js->addRun($duration, $curStartTime);
print "Times size: " . @{$js->times()} . "\n";

соответствующий код из подпрограммы addRun ():

sub addRun {
    my ($self, $duration, $runDateTime) = @_;
    if (!defined($duration) || !defined($runDateTime)) { return 0; }
    push(@{$self->{_times}},$duration);
}

Когда я запускаю этот код, он входит в подпрограмму addRun и помещает значение в переменную _times. Затем я печатаю значение, вызывая метод доступа / мутатор. Но аксессор / мутатор имеет собственную команду печати, поэтому я могу проверить значение, прежде чем его вернуть.

Метод доступа печатает правильное значение, но когда я печатаю то, что было возвращено, оно не определено. Мой синтаксис где-то испорчен? Я просто идиот?

Спасибо

Ответы [ 2 ]

9 голосов
/ 25 мая 2010

Проблема в том, что в вашей подпрограмме times () вы возвращаете массив, а не ссылку на массив.

Затем в вашей основной программе вы пытаетесь разыменовать вызов раз (), но вам это не нужно.

Итак, в вашей основной программе просто назовите ее следующим образом: -

print "Times size: " . $js->times() . "\n";
4 голосов
/ 26 мая 2010

Я попробовал ваш код с включенным use strict; и получил Can't use string ("1") as an ARRAY ref while "strict refs" in use.

Имеется в виду строка: print "Times size: " . @{$js->times()} . "\n";

Метод times возвращает массив значений. Когда вы разыменовываете возвращаемое значение раз, вы даете ему скалярный контекст. Таким образом, массив вычисляется, чтобы дать число членов в массиве, т. Е. 1. Итак, вы пытаетесь получить доступ к @ '1', которого не существует.

Вот очищенная версия вашего кода. У вас было несколько ошибок (невозможно было получить массив длины> 1 при установке с помощью метода times.

#!/usr/bin/perl 

use strict;
use warnings;

my $foo = Foo->new('Pogo');

$foo->addRun( 10, time );
$foo->addRun( 20, time );
print "Times: ", join( ' ', $foo->times ), "\n";
print "Times length: " . $foo->times . "\n";


BEGIN {
    package Foo;

    sub new {
        my ($class, $name) = @_;
        my $self = {
            _name => $name,
            _times => [],
        };
        bless $self, $class;
        return $self;
    }

    sub times {
        my $self = shift;
        if (@_) { 
            my $time_array = shift;
            @{$self->{_times}} = @{$time_array};
        }
        return @{$self->{_times}};
    }

    sub add_times {
        my $self = shift;
        return push @{$self->{_times}}, @_;
    }

    sub addRun {
        my ($self, $duration, $runDateTime) = @_;

        return 0 unless defined($duration) and defined($runDateTime);

        $self->add_times($duration);
    }

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