在这种情况下,Perl 如何知道 exit 需要一个数字参数?
exit 期望一个数字作为其规范的一部分,如果您向其传递一个非整数值(即您不应该这样做。
现在,在这种特殊情况下,dualvar 如何根据上下文返回任一值类型?
我不知道 Scalar::Util 的 dualvar 是如何实现的,但您可以改用 overload 编写类似的东西。
您当然可以修改受祝福对象的行为:
#!/usr/bin/env perl
use strict;
use warnings;
{package Dualvar;
use overload
fallback => 1,
'0+' => sub { $_[0]->{INT_VAL} },
'""' => sub { $_[0]->{STR_VAL} };
sub new {
my $class = shift;
my $self = { INT_VAL => shift, STR_VAL => shift };
bless($self,$class);
}
1;
}
my $x = Dualvar->new(31,'Therty-One');
print $x . " + One = ",$x + 1,"\n"; # Therty-One + One = 32
从文档看来,overload 实际上会更改声明范围内的行为,因此您应该能够在本地更改任何操作数的一些常用运算符的行为。
如果 exit 确实使用这些可重载操作之一将其参数评估为整数,那么这个解决方案就可以了。
我没有看到像在 Java 中那样为子例程的参数定义数据类型的方法?
正如其他人已经说过的那样......在 Perl 中不是这种情况,至少在编译时不是这样,除了子例程 prototypes 但这些不提供太多类型粒度(如 int 与字符串或不同的对象类)。
Richard 提到了一些您可以使用的运行时替代方案。如果您不介意性能损失,我个人会推荐 Moose。