Курс языка программирования Raku / Основы / Больше о типах / Типизированные переменные
Алломорфы
Рассмотрим следующую программу. Можете ли вы сказать, какие входные значения её сломают и на какой строке, до того как запустите её?
my $input = prompt 'Enter something: ';
my Int $i = $input;
my Str $s = $input;
say $i;
say $s;Здесь создаются три скалярные переменные. Две из них, $i
и $s, являются типизированными переменными. Это означает,
что $i может хранить только целые числа, а $s
может хранить только строки.
Возвращаемый тип prompt зависит от введённых символов.
Если входная строка может представлять целое число, результат будет типа
IntStr, который является как Int, так
и Str, и, следовательно, может быть присвоен как переменной
типа Int, так и переменной типа Str. Таким
образом, если вы введёте, например, 1234, программа не
сломается.
$ raku allomorphs.raku
Enter something: 1234
1234
1234Тип IntStr является примером так называемого
алломорфа — типа данных, который объединяет два других типа.
Вот ещё несколько примеров.
Если вы введёте строку, которая не может быть целым числом, программа
сломается в момент присвоения $input переменной
$i:
$ raku allomorphs.raku
Enter something: Hello, World!
Type check failed in assignment to $i; expected Int but got Str ("Hello, World!")
in block <unit> at allomorphs.raku line 2Обратите внимание, что вы получите ошибку, даже если входная строка может быть преобразована в число, но не в целое. Поскольку невозможно хранить число с плавающей запятой или рациональное число в контейнере для целых чисел, Raku выдаст исключение:
$ raku allomorphs.raku
Enter something: 3.14
Type check failed in assignment to $i; expected Int but got RatStr (RatStr.new(3.14, "3....)
in block <unit> at allomorphs.raku line 2Второе присвоение, $s = $input, никогда не сломается,
так как строка может принять любой ввод.
🦋 Исходный код этой программы можно найти в файле allomorphs.raku.
Навигация по курсу
← Тест: Приведение типов | Создайте переменные всех возможных типов →
💪 Или перейдите сразу к упражнениям этого
раздела.