2013-03-28 13 views
6

Zdaję sobie sprawę, że w eterze jest kilka takich pytań, ale nie mogę rozwiązać mojego problemu. Może powinienem poprawić swoje myślenie boczne.Błąd obiektów Perla: Nie można zlokalizować metody obiektu za pomocą pakietu

Mam moduł, który testuję. Moduł ten wyglądał:

package MyModule; 
use strict; 
use warnings; 

... # a bunch of 'use/use lib' etc. 

sub new { 
    my $class = shift; 
    my ($name,$options) = @_; 

    my $self = { 
     _name  => $name, 
     _features => $options, 
     _ids  => undef, 
     _groups => undef, 
     _status => undef, 
    }; 
    bless $self,$class; 
    return $self; 
} 

sub init { 
    my ($self) = @_; 
    my ($ids,$groups,$status) = ...; # these are from a working module 
    $self->{_ids} = $ids; 
    $self->{_groups} = $groups; 
    $self->{_status} = $status; 
    return $self; 
} 

To jest mój plik testowy:

#!/usr/bin/perl -w 

use strict; 
use MyModule; 
use Test::More tests => 1; 
use Data::Dumper; 

print "Name: "; 
my $name; 
chomp($name = <STDIN>); 
print "chosen name: $name\n"; 

my %options = (
    option1 => 'blah blah blah', 
    option2 => 'blu blu blu', 
); 

my $name_object = MyModule->new($name,\%options); 
print Dumper($name_object); 
isa_ok($name_object,'MyModule'); 

$name_object->init; 
print Dumper($name_object); 

Teraz działa w dół do isa_ok, ale potem pojawia się z:

Can't locate object method "init" via package "MyModule" at test_MyModule.t line 31, <STDIN> line 1.

ten zdarzyło się teraz tylko wtedy, gdy próbuję (i nieco zawodzę) korzystać z obiektów. Tak więc uważam, że nie rozumiem zastosowań obiektów w Perlu! Każda pomoc będzie doceniana ...

+0

linii 31 jest 'init' linia być jasne – dgBP

+1

Problem jest z części kodu nie jesteś pokazując nam . –

+4

Nie miałem żadnych problemów z uruchomieniem twojego kodu (oprócz braku 1 na końcu modułu). Czy na pewno nie ma innych modułów nazwy MyModule w ścieżce @INC? Sprawdź% INC, aby upewnić się, że załadowałeś odpowiedni moduł. – imran

Odpowiedz

6

Myślę, że ładujesz inny plik niż ten, który ładujesz.

print($INC{"MyModule.pm"}, "\n"); 

powie, który plik został załadowany. (Jeśli nazwa modułu ma rzeczywiście postać Foo::Bar, należy użyć $INC{"Foo/Bar.pm"}.) Upewnij się, że wielkość liter package i nazwa pliku są zgodne.

-5

Bądź pewien, że jest w twojej klasie ta linia na właściwym miejscu:

use Moose; 
+2

Dlaczego jest to istotne dla pytania? czy możesz wyjaśnić trochę więcej? – PatomaS

+1

Jakie właściwe miejsce? –

Powiązane problemy