如何在对象中使用函数原型?

时间:2013-09-11 08:21:08

标签: perl oop

使用Perl 5+,此代码是否映射我的内部数组?

package somepackage; 
(...)
sub someMappingFunction (\&@) {
    my $this = shift; 
    #well should not because the object is supposed 
    #to a blessed hash reference and not a function.
    my $f = shift; 
    map { &$f($_) } $this->{'some_internal_array'}; 
}

如何通过这种方式调用函数来纠正它?

sub create_mapping_function {
    # this is even more complicated in my real application!
    my $value = shift; 
    my $key = shift;
    return sub {
           my $line = shift; 
           $line=~s/$key/$value/;
           return $line; 
    }
}
(... long, very long ...)
myObject->someMappingFunction create_mapping_function('$option',42);
(...)
mySecondObject->someMappingFunction create_mapping_function('$option',65);

1 个答案:

答案 0 :(得分:4)

不要使用原型,除非你知道完全他们做了什么。原型的目的是改变调用站点解析的方式,并在参数上强加强加上下文。在各种情况下,原型被忽略,方法调用就是这些情况之一(因为无法确定在运行时调用哪个方法)。

原型(\&@)意味着应该像

一样调用该函数
foo &bar, 1, 2, 3;

在我的整个Perl生活中,我从未见过它。而不是实际调用bar,该函数作为引用传递。不要那样做。此外,如果没有& sigil它也无法工作,并且无论如何都无法使用方法。

原型也不是类型约束。

您的someMappingFunction应如下:

sub someMappingFunction {
  my ($self, $function) = @_;
  return map { $function->($_) } @{ $self->{some_internal_array} };
}
  • 此sub不期望在coderef之后进一步论证。
  • 哈希只包含标量,例如引用,但从不自己排列。我们必须取消引用带有外围@{ ... }的数组引用来展平它。 map在列表上运行,而不是在阵列上运行。

您的create_mapping_function状态良好。

调用看起来像

$someObject->someMappingFunction(create_mapping_function("value", "key"));

注意事项:

  • 对象只是特殊的标量变量,因此它们具有$ sigil。
  • 我不确定您是否真的要传递文字字符串'$option'。请注意,它不会在替换中进行评估。
  • 方法调用要么不采取args,那么我们就可以省略parens,例如$foo->bar。否则,方法调用紧跟在parens中的arglist,例如$foo->bar()$foo->bar(1,2,3)