我认为鸭式打字的核心是它是如何使用的。一个人使用实体的方法检测和自省来知道如何处理它,而不是提前声明它将是什么(你知道如何处理它)。
这在 OO 语言中可能更实用,其中原语不是原语,而是对象。
我认为总结它的最好方法,在变体类型中,实体是/可以是任何东西,它是什么是不确定的,而不是实体看起来像任何东西,但你可以通过询问它来弄清楚它是什么.
这是我不相信没有鸭式打字的事情。
sub dance {
my $creature = shift;
if( $creature->can("walk") ){
$creature->walk("left",1);
$creature->walk("right",1);
$creature->walk("forward",1);
$creature->walk("back",1);
}
if( $creature->can("fly") ){
$creature->fly("up");
$creature->fly("right",1);
$creature->fly("forward",1);
$creature->fly("left", 1 );
$creature->fly("back", 1 );
$creature->fly("down");
} else if ( $creature->can("walk") ) {
$creature->walk("left",1);
$creature->walk("right",1);
$creature->walk("forward",1);
$creature->walk("back",1);
} else if ( $creature->can("splash") ) {
$creature->splash( "up" ) for ( 0 .. 4 );
}
if( $creature->can("quack") ) {
$creature->quack();
}
}
my @x = ();
push @x, new Rhinoceros ;
push @x, new Flamingo;
push @x, new Hyena;
push @x, new Dolphin;
push @x, new Duck;
for my $creature (@x){
new Thread(sub{
dance( $creature );
});
}
任何其他方式都需要您对函数进行类型限制,这将删除不同的物种,需要您为不同的物种创建不同的函数,使得代码维护起来非常麻烦。
这真的很糟糕,只是试图表演好的编舞。