当方法是CODEREF时,继承如何工作?

时间:2016-09-30 20:05:04

标签: perl mojolicious

Mojo::EventEmitter中,我们有下一行代码:

for my $cb (@$s) { $self->$cb(@_) }

$cbCODEREF回调的地方。

如果我写的话,会有什么不同吗?

for my $cb (@$s) { $cb->($self, @_) }

我认为继承不起作用,因为$cbCODEREF,因为它适用于$cb包含带方法名称的字符串的情况。 所以在这种情况下,重写代码的工作方式类似。

我理解是好还是错过了什么?

1 个答案:

答案 0 :(得分:5)

Scanner input = new Scanner(System.in); int division = 0; do { System.out.print("How many numbers do you want to divide? "); division = input.nextInt(); } while (division <= 0); double[] divisionArray = new double[division]; for (int i = 0; i < division; i++) { System.out.print("Enter your " + (i + 1) + ". number: "); divisionArray[i] = input.nextDouble(); if (divisionArray[i] == 0 && i>0) { // Remove this if you want to allow the user to divide by zero. Entering zero as the first argument is legal System.out.println("Zero is an illegal argument, please enter a different number"); i--; } } double resultDivision = divisionArray[0]; for (int k = 1; k < division; k++) { resultDivision = resultDivision / divisionArray[k]; } System.out.println("Result: " + resultDivision); 是代码引用时,不会检查继承。事实上,$cb根本没有被检查过。

$self是代码参考时,

$cb

在功能上与

相同
$self->$cb(@_)

这就是为什么$cb->($self, @_) 应该使用继承后的$cb来获得。

can

请注意,有些人使用

package Parent {
   sub new { bless({ @_ }, shift) }
   sub method { CORE::say("!"); }
}

package Child {
   our @ISA = 'Parent';
}

my $self = Child->new();
my $method_name = 'method';

my $cb = $self->can($method_name)
   or die("The object's class doesn't have method $method_name\n");

$self->$cb();

作为

的替代方案
my $f = "function_name";
undef->$f();

然而,使用方法调用来调用非方法是非常不合适的,并且这个技巧仅在sub没有参数时才有效。如果你对这个(适当的)使用my $f = "sub_name"; no strict qw( refs ); $f->(); 确实有问题,你可以使用以下(documented)技巧:

no strict