Функция отображения Perl с OO Perl - PullRequest
2 голосов
/ 23 августа 2011

В методе объекта Perl я хотел бы вызвать другой метод в списке переменных.Использование карты, как это не работает:

($open, $high, $low, $close) 
    = map( $self->adjust_for_factor, ($open, $high, $low, $close) );

....

sub adjust_for_factor {
    my $self = shift;
    my $price = shift;

    return $price *  $self->get_factor ;
}

Это работает, однако это уродливо и не масштабируется.Я уверен, что здесь должна быть возможность использовать карту:

($open, $high, $low, $close) 
= (  $self->adjust_for_factor($open)
, $self->adjust_for_factor($high)
, $self->adjust_for_factor($low)
, $self->adjust_for_factor($close) );

Я думаю, это проблема правильной ссылки на себя.У меня проблемы с концептуализацией того, как все это сочетается.

Спасибо всем, кто нашел время, чтобы рассмотреть / оставить отзыв.

Ответы [ 3 ]

7 голосов
/ 23 августа 2011

Как сказал @tchrist, вы забыли передать $_ своему методу.Правильный путь будет

($open, $high, $low, $close)    
    = map $self->adjust_for_factor($_), $open, $high, $low, $close;

. Вы также можете изменить метод так, чтобы он мог принимать список:

sub adjust_for_factor {
    my ($self, @prices) = @_;

    return map $_ * $self->get_factor, @prices;
}

($open, $high, $low, $close)      
     = $self->adjust_for_factor($open, $high, $low, $close);
4 голосов
/ 23 августа 2011

Вы забыли передать параметр в метод вашего объекта (hat tip tchrist), вот рабочий пример:

$ cat l1.pl
use strict;
package p;

sub new { return bless({factor => $_[1]}, $_[0]); }
sub get_factor { return $_[0]->{factor}; }
sub adjust_for_factor {
    my ($self, $price) = @_;
    return $price * $self->get_factor;
}

package main;

my $obj = p->new(3); # Don't use "self" for object name outside object's class!
my @res = map ($obj->adjust_for_factor($_), qw(1 2 3));
print join(", ", @res) . "\n";

$ ./l1.pl
3, 6, 9
3 голосов
/ 23 августа 2011
($open, $high, $low, $close) =
    map $self->adjust_for_factor, $open, $high, $low, $close;

должно быть

($open, $high, $low, $close) =
    map $self->adjust_for_factor($_), $open, $high, $low, $close;

, которое можно сократить до

$_ = $self->adjust_for_factor($_)
    for $open, $high, $low, $close;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...