我有一个方法哈希表:
my %makefileMacroSimplifiers = (
"or" => \&makefileSimplifyOr,
"and" => \&makefileSimplifyAnd,
"strip" => \&makefileSimplifyStrip,
);
sub makefileSimplifyStrip {
my $self = shift;
my $prefix = shift;
my $paramsRef = shift;
...
}
每个方法都需要$self
。我所拥有的是:
$makefileMacroSimplifiers{$macroName}->($self, $macroName.$ws1, \@parms);
这似乎有效,但我明确地将$self
传递给方法似乎有点奇怪。有没有更好的方法,或者这被认为是正常的编码实践? (我没有找到更好的方法在网上做到这一点,但我想如果我没有使用正确的搜索条件,我会问。)
答案 0 :(得分:2)
您还可以在对象上调用代码引用。那样左边的东西就会传入。
my $coderef = sub { ... };
$self->$coderef(@args);
使用哈希元素不会像这样工作。
$self->$dispatch{foo}(1, 2, 3); # BOOM
这是语法错误。所以你需要先获取代码参考。 Borodin also explains this above in their comment
my %dispatch = (
foo => sub { print "@_" },
);
require HTTP::Request;
my $obj = HTTP::Request->new;
my $method = $dispatch{foo};
$obj->$method(1, 2, 3);
我在这里使用HTTP :: Request作为任意类/对象的一个例子。