2016-03-23 24 views
-1

Perl için yeni ve Perl'de sınıfımın bir niteliği olarak bir 2B dizi tanımlamaya çalışıyorum. aşağıdaki gibi ben,Perl'de sınıf içi 2B dizi tanımlama

sub new{ 
my $class = shift; 
my $self = {}; 

my @board = []; 
for (my $i = 0; $i < 8; $i++){ 
    for(my $j = 0; $j < 8; $j++){ 
     $board[$i][$j] = '.'; 
    } 
} 
$self->{board} = @board; 
bless($self, $class); 
return $self; 
} 

Ama benim sınıfını tanımlamak daha sonra ben

Can't use string ("8") as an ARRAY ref while "strict refs" in use 

kimse bana söyleyebilir belirten bir hata var bu

$self->{board}[$i][$j] = ' '; 

gibi tahta alanını erişmeye çalıştığınızda üzerinde Bunu yapmanın doğru yolu nedir? Sadece kullanımı kesin olarak silmek istemiyorum.

cevap

5

ben, değil my @board=[]; hakkında

sub new{ 
my $class = shift; 
my $self = {}; 

my @board =(); # not [] 
for (my $i = 0; $i < 8; $i++){ 
    for(my $j = 0; $j < 8; $j++){ 
     $board[$i][$j] = '.'; 
    } 
} 
$self->{board} = \@board; # not @board 
bless($self, $class); 
return $self; 
} 

veya

sub new{ 
my $class = shift; 
my $self = {}; 

my $board = []; # not @board 
for (my $i = 0; $i < 8; $i++){ 
    for(my $j = 0; $j < 8; $j++){ 
     $board->[$i][$j] = '.'; 
    } 
} 
$self->{board} = $board; # not @board 
bless($self, $class); 
return $self; 
} 

olan çizgiler değişti ve yorum # niyetinizi bkz eminim ne kodunuzu değiştirmiş =([],); ile aynı şekilde, ilk öğesi bir ARRAY için @board referansı olan bir liste (ARRAY anlamına gelir) atar, ancak bu sizin kodu, bu boş dizi referans tahsisi ve atama sıfırı üzerine yazdığınız için başarısız olur. @board, $ self -> {board} bekleyeceği bir liste değil,

+0

Yığın Taşması ve Perl etiketine hoş geldiniz. Bu oldukça iyi bir ilk cevap! Satır içi kod formatınızın tutarlı olduğundan emin olun ve belki de belgelere bir bağlantı ekleyin. İyi işlere devam et! :) – simbabque

+0

Kod sürüm # 1'e göre değiştirdim, ancak bir altprogramda erişmeye çalıştığımda hala aynı hatayı aldım. –

+0

Oh, problemi buluyor gibi görünüyorum, altprogramda boş olan doğrudan altprogramda $ self -> {board} [$ i] [$ j] kullanmayı deneyin. Fakat altprogram kendi sınıflarının özelliklerine erişemez mi? –

1

$self karma dosyanızın içine bir referans atıfta bulunmanız gerekir. Şu anda skaler bağlamda bir dizi değer yerleştiriyorsunuz - bu, uzunluğu 8. Elbette bunu daha sonra herhangi bir şeye referans olarak kullanamazsınız.

$self->{board} = \@board; 
+0

Ama değeri değiştirmek istemiyorsam ne olur? Geçici değişiklikler yapmak istediğimde bunu kopyalamak zorunda mıyım? –

+0

Bir alt programda erişmenin doğru yolu ne olmalıdır? –

+1

@LouisKwong ilk sorunuzda daha fazlasını açıklayabilir misiniz? İkinci soruya göre, belirli bir alan için erişim sağlayıcıları tanımlamanız gerekir; böylece, döşemede bir alan olan '$ obj-> tile ($ x, $ y)' dır. – simbabque

0

Diğerleri size sorunun yapıcınızla ilgili açıklamalarını vermişlerdir. Ekleyeceğim, $board değişkenini atlayıp C stili döngüler kullanarak biraz basitleştirebilirsiniz.

sub new { 
    my $class = shift; 

    my $self = {}; 
    $self->{board} = []; 

    for my $i (1 .. 8) { 
    for my $j (1 .. 8) { 
     $self->{board}[$i][$j] = '.'; 
    } 
    } 

    return bless $self, $class; 
} 

Ben de daha kolay ayarlanabilir ve yönetim kurulu öğeleri almak için yapmak aşağıdaki üç yöntemi eklersiniz:

sub board { 
    my $self = shift; 
    return $self->{board}; 
} 

sub set_board_element { 
    my $self = shift; 
    my ($i, $j, $val) = @_; 

    $self->board->[$i][$j] = $val; 
} 

sub get_board_element { 
    my $self = shift; 
    my ($i, $j) = @_; 

    return $self->board->[$i][$j]; 
} 

Eğer sınıfını yazmaya Moose kullanmayı düşündünüz mü? Hayatını kolaylaştıracak. Özellikle, Array traits, sorununuz için iyi bir uyum gibi görünüyor.