Курс по 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 4.0. Оригинален текст на английски

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