2009-06-29 12 views
12

मुझे मूस में कक्षा विशेषता की आवश्यकता है। अभी मैं कह रहा हूं:मूस में कक्षा विशेषता बनाने का सबसे अच्छा तरीका क्या है?

#!/usr/bin/perl 

use 5.010; 
use strict; 
use warnings; 
use MooseX::Declare; 

class User { 
    has id  => (isa => "Str", is => 'ro', builder => '_get_id'); 
    has name => (isa => "Str", is => 'ro'); 
    has balance => (isa => "Num", is => 'rw', default => 0); 

    #FIXME: this should use a database 
    method _get_id { 
     state $id = 0; #I would like this to be a class attribute 
     return $id++; 
    } 
} 

my @users; 
for my $name (qw/alice bob charlie/) { 
    push @users, User->new(name => $name); 
}; 

for my $user (@users) { 
    print $user->name, " has an id of ", $user->id, "\n"; 
} 

उत्तर

8

मुझे MooseX :: ClassAttribute मिला, लेकिन यह बदसूरत लग रहा है। क्या यह सबसे साफ तरीका है?

#!/usr/bin/perl 

use 5.010; 
use strict; 
use warnings; 
use MooseX::Declare; 

class User { 
    use MooseX::ClassAttribute; 

    class_has id_pool => (isa => "Int", is => 'rw', default => 0); 

    has id  => (isa => "Str", is => 'ro', builder => '_get_id'); 
    has name => (isa => "Str", is => 'ro'); 
    has balance => (isa => "Num", is => 'rw', default => 0); 

    #FIXME: this should use a database 
    method _get_id { 
     return __PACKAGE__->id_pool(__PACKAGE__->id_pool+1); 
    } 
} 

my @users; 
for my $name (qw/alice bob charlie/) { 
    push @users, User->new(name => $name); 
}; 

for my $user (@users) { 
    print $user->name, " has an id of ", $user->id, "\n"; 
} 
+0

यह सही तरीका है। यदि आप उन्हें एक अलग पैकेज में पसंद करते हैं, तो आप क्लास क्लास (जैसा भी थे) बना सकते हैं, देखें कि क्लास एट्रिब्यूट हुड – castaway

+0

के तहत क्या करता है, 'सख्त' का उपयोग नहीं किया जाता है और 'मूसएक्स का उपयोग करें 'घोषणा' के साथ 'चेतावनी का उपयोग' अनावश्यक है। ? –

+0

@ रॉबर्ट पी शायद, मैं बस MooseX का उपयोग करना शुरू कर रहा था :: जब मैंने इसे लिखा था घोषित करें। –

2

ईमानदारी से, मुझे नहीं लगता कि कक्षा गुणों के लिए यह सभी परेशानी आवश्यक है। केवल-पढ़ने वाले वर्ग विशेषताओं के लिए, मैं केवल एक उप-उपयोग करता हूं जो निरंतर लौटाता है। पढ़ने-लिखने की विशेषताओं के लिए, पैकेज में एक सरल राज्य चर आमतौर पर चाल (मैं अभी तक कोई परिदृश्यों जहां मैं कुछ और अधिक जटिल की जरूरत में चलाने नहीं किया है।) करता है

state $count = 0; 
method _get_id { 
    return ++$count; 
} 

एक शाब्दिक के साथ एक निजी ब्लॉक किया जा सकता है यदि आपको प्री-5.10 संगतता की आवश्यकता है तो इसका उपयोग किया जाता है।

+2

आह, लेकिन id_pool केवल जरूरी नहीं पढ़ा जाता है, मैं एक सच्ची कक्षा विशेषता चाहता हूं जिसमें एक एक्सेसर हो। जब मैं आईडी पूल को किसी डेटाबेस में स्थानांतरित करने का निर्णय लेता हूं तो मैं कोड को फिर से लिखना नहीं चाहता हूं। यदि यह एक एक्सेसर था, तो मुझे बस बदलना होगा कि एक्सेसर कैसे काम करता है, एक राज्य चर के साथ मुझे या तो इसके सभी संदर्भों को बदलने या इसे एक बंधे स्केलर बनाने की आवश्यकता होगी। –