在这种情况下,Perl 如何知道 exit 需要一个数字参数?
exit期望一个数字作为其规范的一部分,如果您传递一个非整数值(即您不应该这样做),它的行为是一种未定义的。
现在,在这种特殊情况下, dualvar如何根据上下文返回任一值类型?
我不知道 Scalar::Util 的dualvar是如何实现的,但你可以用重载来编写类似的东西。
您当然可以修改受祝福对象的行为:
#!/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
从文档来看,重载似乎实际上改变了声明范围内的行为,因此您应该能够在本地为任何操作数更改一些常用运算符的行为。
如果exit确实使用这些可重载操作之一将其参数评估为整数,那么此解决方案就可以了。
我没有看到像在 Java 中那样为子例程的参数定义数据类型的方法?
正如其他人已经说过的那样......在 Perl 中不是这种情况,至少在编译时不是这样,除了子例程原型,但这些没有提供太多的类型粒度(如 int 与字符串或不同的对象类)。
Richard 提到了一些您可以使用的运行时替代方案。如果您不介意性能损失,我个人会推荐Moose 。