В какой-то момент я прочитал достаточно убедительный аргумент в Perlmonks о том, что проверка типа скаляра с ref
или reftype
- плохая идея. Я не помню, кто выдвинул идею или ссылку. К сожалению.
Дело в том, что в Perl есть много механизмов, которые позволяют сделать данный скалярный акт практически любым, что вы хотите. Если вы tie
используете файловый дескриптор так, чтобы он действовал как хеш, тестирование с reftype
скажет вам, что у вас есть файловый файл. Он не скажет вам, что вам нужно использовать его как хеш.
Итак, аргумент пошел, лучше использовать утку, чтобы выяснить, что такое переменная.
Вместо:
sub foo {
my $var = shift;
my $type = reftype $var;
my $result;
if( $type eq 'HASH' ) {
$result = $var->{foo};
}
elsif( $type eq 'ARRAY' ) {
$result = $var->[3];
}
else {
$result = 'foo';
}
return $result;
}
Вы должны сделать что-то вроде этого:
sub foo {
my $var = shift;
my $type = reftype $var;
my $result;
eval {
$result = $var->{foo};
1; # guarantee a true result if code works.
}
or eval {
$result = $var->[3];
1;
}
or do {
$result = 'foo';
}
return $result;
}
По большей части я на самом деле не делаю этого, но в некоторых случаях имею. Я все еще решаю, когда этот подход уместен. Я думал, что выкину концепцию для дальнейшего обсуждения. Я хотел бы видеть комментарии.
Обновление
Я понял, что должен высказать свои мысли об этом подходе.
Этот метод имеет преимущество в обработке всего, что вы в него бросаете.
Его недостаток в том, что он громоздкий и несколько странный. Если наткнуться на это в каком-то коде, это заставит меня выпустить большой жирный «WTF».
Мне нравится идея проверить, действует ли скаляр как как хеш-реф, а не как хэш-реф.
Мне не нравится эта реализация.