2013-03-28 3 views
6

Я понимаю, что в эфире есть несколько таких вопросов, но я не могу решить проблему. Возможно, я должен улучшить свое боковое мышление.Ошибка объектов Perl: не удается найти метод объекта через пакет

У меня есть модуль, который я тестирую. Этот модуль выглядит примерно так:

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; 
} 

Это мой тестовый файл:

#!/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); 

Теперь он работает вплоть до isa_ok, но потом приходит с:

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

Этот теперь произошло только сейчас, когда я пытаюсь (и несколько не получается) использовать объекты. Поэтому, таким образом, я считаю, что неправильно понимаю приложения объектов в Perl! Любая помощь была бы оценена ...

+0

линии 31 является 'init' линия ясно – dgBP

+1

Проблемы с частью коды вы не показываете нам , –

+4

У меня не было проблем с запуском вашего кода (кроме отсутствующего 1, в конце модуля). Вы уверены, что в вашем пути @INC нет других имен модулей MyModule? Проверьте% INC, чтобы убедиться, что вы загрузили правильный модуль. – imran

ответ

6

Я думаю, вы загружаете другой файл, отличный от того, который, по вашему мнению, вы загружаете.

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

сообщит вам, какой файл вы фактически загрузили. (Если имя модуля действительно имеет вид Foo::Bar, используйте $INC{"Foo/Bar.pm"}.) Убедитесь, что заглавная буква package и имя файла совпадают.

-5

Убедитесь, что там находится внутри вашего класса этой линия на нужном месте:

use Moose; 
+2

Почему это относится к вопросу? можете ли вы объяснить немного больше? – PatomaS

+1

В каком правом месте? –

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