访问要在外部显式调用的包中的 Moose 对象
Accessing Moose object in package to be called explicitly outside
对于 Moose 包,我试图在 Perl(非 moose)中创建一个对象,然后尝试访问外部的方法。解释这种情况的代码在这里。
package person;
{
use Moose;
sub test {
print "my test print";
}
}
package people {
use person;
my $obj = person->new();
}
$people::obj->test()
我在执行此 perl 代码时遇到以下错误。
Can't call method "test" on an undefined value at test.pm
我在这里遗漏了什么吗?
您从未将任何内容分配给 $people::obj
。您将一些东西分配给了一个名为 $obj
的不相关的词法变量,这个变量在程序到达方法调用时甚至不存在。词法变量(例如由 my
创建的变量)的范围限定在它们所在的最里面的卷曲中,也就是说它们只在那里可见(可访问)。
修复:
package Person;
{
use Moose;
sub test {
print "my test print";
}
}
package People {
my $obj = person->new();
sub get_person {
return $obj;
}
}
People->get_person->test();
备注:
- 删除了
use person;
,它要么阻止程序编译,要么无意中执行了一些潜在冲突的代码。
- 小写模块名称保留用于编译指示。
- 我本可以将词法变量更改为包变量,但使用全局变量是一种不好的做法。使用方法(或子方法)可以使将来的事情变得容易得多。
- 小心将多个 packages/classes 放在一个文件中。有坑。
如果你确实想使用 $obj
作为全局变量并在包外使用它,你必须用 our
定义它。改变
my $obj = person->new();
到
our $obj = person->new();
并且您的脚本有效。但是使用全局变量——即使像 ikegami 提议的那样通过吸气剂——通常不是一个好主意。
对于 Moose 包,我试图在 Perl(非 moose)中创建一个对象,然后尝试访问外部的方法。解释这种情况的代码在这里。
package person;
{
use Moose;
sub test {
print "my test print";
}
}
package people {
use person;
my $obj = person->new();
}
$people::obj->test()
我在执行此 perl 代码时遇到以下错误。
Can't call method "test" on an undefined value at test.pm
我在这里遗漏了什么吗?
您从未将任何内容分配给 $people::obj
。您将一些东西分配给了一个名为 $obj
的不相关的词法变量,这个变量在程序到达方法调用时甚至不存在。词法变量(例如由 my
创建的变量)的范围限定在它们所在的最里面的卷曲中,也就是说它们只在那里可见(可访问)。
修复:
package Person;
{
use Moose;
sub test {
print "my test print";
}
}
package People {
my $obj = person->new();
sub get_person {
return $obj;
}
}
People->get_person->test();
备注:
- 删除了
use person;
,它要么阻止程序编译,要么无意中执行了一些潜在冲突的代码。 - 小写模块名称保留用于编译指示。
- 我本可以将词法变量更改为包变量,但使用全局变量是一种不好的做法。使用方法(或子方法)可以使将来的事情变得容易得多。
- 小心将多个 packages/classes 放在一个文件中。有坑。
如果你确实想使用 $obj
作为全局变量并在包外使用它,你必须用 our
定义它。改变
my $obj = person->new();
到
our $obj = person->new();
并且您的脚本有效。但是使用全局变量——即使像 ikegami 提议的那样通过吸气剂——通常不是一个好主意。