Moose

2010-04-25 20 views
5

'da temel bir özellik değiştiğinde tembel yapılı özniteliğin yeniden oluşturulması, lazy_build özniteliğine sahip bir Moose sınıfım var. Bu özelliğin değeri başka bir (tembel olmayan) özniteliğin bir işlevidir.Moose

Birinin, sınıfı istenen öznitelik için 42 değeriyle başlattığını varsayalım. Daha sonra 42'lik bir fonksiyon olarak hesaplanan tembel niteliğini talep ederler. Daha sonra, ilk niteliği değiştirmek için sinirleri vardır!

Tembel olan zaten oluşturuldu, bu nedenle oluşturucu yeniden çağrılmayacak ve tembel özniteliği artık güncel değil.

Gerekli öznitelik üzerinde "kirli" bir bayrağı koruduğum bir çözümüm var ve tembel olan bir erişimci, kirli bayrağı kontrol ediyor ve gerekiyorsa yeniden oluşturuyor. Bununla birlikte, bu çok iş gibi görünüyor. Bunu, Moose içinde ele almak için bir yol var mı, örn. özellikleri kullanarak?

+0

Aynı soruyu sorduğumda yanıtları incelemek isteyebilirsiniz: [Özellik değerleri değiştiğinde hesaplamaların önbelleğe alınmış sonuçları sona eriyor] (http://stackoverflow.com/questions/1775572/moose-expiring-cached-results -of-calculations-when-attribute-values-change "Öznitelik değerleri değiştiğinde hesaplamaların önbelleğe alınmış sonuçlarının sonlandırılması") – clscott

cevap

9

Benim tipik çözüm:

has 'attr1' => (
    ... 
    trigger => \&clear_attr2, 
); 

yani nitelik1 güncellendiğinde, ATTR2 temizlenir ve sonraki erişildiğinde yeniden inşa edilecek. clear_attr2, lazy_build'u kullandığınızda ücretsiz olarak gelir. Accessor yöntemlerini kullandığınız sürece, 'kirli' bir bayrağa ihtiyacınız yoktur.

Bu yaygın bir modeldir - "türetilmiş" özniteliklerin üstesinden gelmek için bir çeşit özellik güzel olurdu.

+1

Mükemmel. Bu çözümü çok beğendim. Set_attr1'de 'after' modifier yaparak aynı yönde ilerliyordum ama tetikleyici daha da kolay. Teşekkürler – friedo

İlgili konular