2015-12-27 4 views
3

УчитываяПроверьте, будет ли принуждение успешным?

my $t=+"aaa"; 

возможно проверить Тхо, если принуждение удастся (я знаю, что это не здесь) перед использованием $ T?

BTW: Я действительно хочу проверить, является ли строка допустимым Integer. Я знаю, что для этой цели я могу использовать регулярное выражение, но я полагаю, что существует более простое решение.

ответ

5

+'aaa' приводит к недостаточности, которая является своего рода Нила, который немного походит на неопределенное значение. Это означает, что вы можете использовать все, что с ними связано.

my $t = +$s with +$s; # $t remains undefined 
my $t = +$s // 0; # $t === 0 
my $t = (+$s).defined ?? +$s !! 0; 

Так что вы хотите сделать, это проверить, если он является Int

my $t = +$s ~~ Int ?? +$s !! 0; # Failures aren't a type of Int 
my $t = 0; 
with +$s { 
    when Int { $t = $_ } 
    default { ... } # +$s is defined 
} else { 
    ... # optional else clause 
} 
+1

Ваша первая версия также может быть написана как 'my $ t = $ _ с + $ s;' как 'with' является topicalizer – Christoph

+0

@ Christoph Yeah Я думал о 'with' как ** определенном, если **, который будет хранить его только в переменной темы, если вы использовали узкий блок. (Я сыграл небольшую часть своего создания, указав, как «если определено $ a.method -> $ b {...}' не может поместить значение '$ a.method' в' $ b') Поскольку это было основным стимулом для его создания, конечно, это всегда актуально. –

-1

Оберните его вокруг блока try, чтобы поймать исключение.

my $t; 
try { 
    $t = +"aaa"; 
    CATCH { say "the coercion didn't work" when X::Str::Numeric; } 
} 
+3

Это должно быть 'CATCH {default {say" принуждение не работает "}}' или 'CATCH {когда X :: Str :: Numeric {say" принуждение не работает}}} 'или базовый тип 'X :: Str :: Numeric', в противном случае Perl 6 не смог бы определить, хотите ли вы обработать ошибку, или если вы перебросили его. Вы также можете выполнить 'try {...} или сказать ...' –

3

Еще одна версия:

my $t = +"aaa" orelse note "could not coerce to numeric type"; 
say $t.^name; # Failure 

orelse является версией с низким уровнем приоритета //. В этой версии назначение $t все еще происходит, но проверка на определенность обрабатывает сбой, то есть он не взорвется и не вызовет ошибку.

+2

На самом деле 'orelse' также локализуется. 'my $ t = +" aaa "orelse note .message' –

Смежные вопросы