gpt4 book ai didi

perl - 我可以将 CODE 引用与在 Perl 中包含它的 HASH 引用相关联吗?

转载 作者:行者123 更新时间:2023-12-04 07:51:03 25 4
gpt4 key购买 nike

我想创建一个哈希引用,其中代码引用映射到标量(字符串)作为其成员。
到目前为止,我有一个看起来像这样的 map 引用:

my $object;
$object = {
'code1' => sub {
print $_[0];
},
'code2' => sub {
return 'Hello, World!';
},
'code3' => sub {
$object->{code1}->($object->{code2}->());
}
};
$object->{code3}->();
我希望能够使用 $object 来“祝福”$object 中的“code3”引用,因此我可以执行以下操作:
my $object;
$object = {
'code1' => sub {
print $_[0];
},
'code2' => sub {
return 'Hello, World!';
},
'code3' => sub {
$self = shift;
$self->{code1}->($self->{code2}->());
}
};
$object->{code3}->();
但是,bless 仅适用于包,而不适用于哈希表。
有没有办法在 Perl 5 版本 22 中做到这一点?
注意:现在想起来,最好是显式传递$object给方法,因为它解决了JavaScript的 "this"问题。我太习惯了 Java 的“this”,这在 Java 中是有意义的,其中一切都是一个类,因此所有方法都有一个“this”,但是在脚本编写中,知道“this”是否真的被传递了,或者是它只是作为一个函数调用(你最终不小心污染了全局范围或触发了严格的警告)通过 $self 明确地表明你不是作为一个函数调用它,而是作为一个方法调用它。

最佳答案

您正在执行子调用(不是方法调用),所以您只是忘记传递 $self作为参数。

my $object = {
code1 => sub {
print $_[0];
},
code2 => sub {
return 'Hello, World!';
},
code3 => sub {
my $self = shift;
$self->{code1}->( $self, $self->{code2}->($self) );
}
};
$object->{code3}->($object);

但我认为您正在尝试创建类似 JavaScript 的对象。您可以从以下几点开始:
package PrototypeObject;

sub new {
my $class = shift;
my $self = bless({}, $class);
%$self = @_;
return $self;
}

sub AUTOLOAD {
my $self = shift;
( my $method = our $AUTOLOAD ) =~ s/^.*:://s;
return $self->{$method}->($self, @_);
}

1;


use PrototypeObject qw( );

my $object = PrototypeObject->new(
code1 => sub {
print $_[1];
},
code2 => sub {
return 'Hello, World!';
},
code3 => sub {
my $self = shift;
$self->code1( $self->code2() );
}
);

$object->code3();

请注意,这会减慢您的方法调用速度,因为它必须在调用您的方法之前调用 AUTOLOAD。这可以通过重载方法调用运算符来解决。

检查 CPAN。有人可能已经有了更完整的实现。

关于perl - 我可以将 CODE 引用与在 Perl 中包含它的 HASH 引用相关联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39439071/

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