gpt4 book ai didi

linux - 无法通过包 "say_hello"定位对象方法 "1"

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:45 25 4
gpt4 key购买 nike

我刚开始学习 Perl。当我转向面向对象时,出现类似

的错误
Can't locate object method "say_hello" via package "1" (perhaps you forgot to load "1"?) at ./main.pl line 8.

我在谷歌上搜索了很多解决方案。有一些类似的问题,如 this .我的理解是这不是一般问题。

这是我的课

# MyModule.pm

package MyModule;
use strict;
use warnings;

sub new {
print "calling constructor\n";
}

sub say_hello {
print "Hello from MyModule\n";
}

1;

这是我的测试脚本

# main.pl

#!/usr/bin/perl -w
use strict;
use warnings;

use MyModule;

my $myObj = new MyModule();
$myObj->say_hello();

如果从 main.pl 中删除最后一行,代码将完美运行

最佳答案

您的构造函数new 需要返回一个blessed 引用 到您用来包含对象信息的数据结构。你这里没有相关数据,但你还需要返回一些东西

bless 将数据与特定包相关联。在这种情况下,您的对象应该被加持到 MyModule 中,以便 perl 知道在看到像 $myObj- 这样的方法调用时寻找 MyModule::say_hello >say_hello()

您当前的构造函数返回 print 语句返回的值,如果成功则为 1,几乎可以肯定。这就是为什么您会在错误消息中看到 “1”

Can't locate object method "say_hello" via package "1" (perhaps you forgot to load "1"?) at ./main.pl line 8.

对象数据最常见的容器是散列,因此您需要将new 更改为此

sub new {

print "calling constructor\n";

my $self = { };
bless $self, 'MyModule';
return $self;
}

然后您的程序将正常运行。它创建一个匿名散列并将其分配给 $self 变量,然后祝福并返回它

请注意,这可以变得更加简洁:

  • 没有return 语句,子例程将返回最近执行的语句的值

  • 默认情况下,bless会将数据bless到当前包中

  • 在加持之前无需将引用存储在变量中

所以这样写也可以达到同样的效果

sub new {

print "calling constructor\n";

bless { };
}

另请注意,您的通话

my $myObj = new MyModule()

不太理想。它被称为间接宾语表示法,并且可能是模棱两可的。最好始终使用直接方法引用,例如

my $myObj = MyModule->new()

为了消除调用的歧义

关于linux - 无法通过包 "say_hello"定位对象方法 "1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41483562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com