2013-11-23 3 views
1

Благодарим за помощь!Perl :: Moose: использование считывающего устройства для возврата только вычисленного значения

Допустим, у меня есть класс складе:

package Stock; 
use Moose; 

has 'quantity' => (is => 'rw',); 
has 'price' => (is => 'rw',); 
has 'value' => (is => 'ro',); 

1; 

Как я могу вычислить значение (количество * цена), когда значение используется, а не когда цены или количество изменений?

EDIT: Извините, если это не было полным, но, конечно, значение всегда должно возвращать последнее значение количества * цены, поскольку они могут измениться.

Это должно быть простым, но я предполагаю, что я не вижу дрова для всех деревьев ...

Большое спасибо за вашу помощь!

ответ

4

Вы, вероятно, хотите нормальный метод:

package Stock; 
use Moose; 

has 'quantity' => (is => 'rw',); 
has 'price' => (is => 'rw',); 

sub value { 
    my $self = shift; 
    return $self->quantity * $self->price; 
} 

Альтернативно, крючок в сеттеры для quantity и price и иметь их обновлять value всякий раз, когда устанавливается новое значение.

Преимущество крючков: значение кэшируется, что хорошо, когда расчет дорог (не здесь).
Преимущество простого метода: проще реализовать.

0
package Stock; 
use Moose; 

has 'price' => (is => 'rw'); 
has 'quantity' => (is => 'rw'); 
has 'value' => (
    is => 'ro', 
    writer => 'set_value', 
); 

before 'value' => sub { $_[0]->set_value($_[0]->price * $_[0]->quantity) }; 

1; 

package main; 

$\ = $/; 
my $b = Stock->new(price=>100, quantity=>99); 

print $b->value; 

$b->price(10); 
$b->quantity(87); 

print $b->value; 

Это будет печатать:

9900 
870 
+0

Это работает нормально один раз, но если количество изменяется ($ b-> quantity (19);), оно все еще показывает старое значение. –

+0

Я уточнил вопрос, чтобы никто не попадал в эту ловушку. Спасибо! –

+0

Обновили ответ. – edem

 Смежные вопросы

  • Нет связанных вопросов^_^