在Mojo::EventEmitter中,我们有下一行代码:
for my $cb (@$s) { $self->$cb(@_) }
$cb
是CODEREF
回调的地方。
如果我写的话,会有什么不同吗?
for my $cb (@$s) { $cb->($self, @_) }
我认为继承不起作用,因为$cb
是CODEREF
,因为它适用于$cb
包含带方法名称的字符串的情况。
所以在这种情况下,重写代码的工作方式类似。
我理解是好还是错过了什么?
答案 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