Курс языка программирования 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.

Навигация по курсу

Типизированные переменные / Приведение типов для типизированных переменных   |   💪 Упражнения: Типизированные переменные

Эта страница автоматически переведена с помощью ChatGPT 4o. Оригинальный текст на английском языке.

Переводы этой страницы: EnglishDeutschEspañolItalianoLatviešuNederlandsБългарскиРусскийУкраїнська