Программирование главным образом направлено на перемещение данных с места на место, и вам
потребуются контейнеры для этих данных. Переменные Кристалла могут хранить различные виды
данных. Как и в большинстве языков, вы присваиваете их конкретной переменной символом '='.
===
...bles.cr
\листинг 1\
===
Однако предназначение Crystal — это нечто большее, нежели только помещение значения в переменную. Компилятор определяет тип переменной из приписанного ей значения. Вы можете просмотреть типы переменных, определенных компилятором самовольно, проверив отображение типа с помощью выражения typeof.
===
\листинг 2\
...# => Int32
===
Crystal интерпретировал переменную name как String, так как вы использовали двойные кавычки.
Он интерпретировал element как символ (одиночное символьное значение), поскольку вы использовали одиночные кавычки.
Он интерпретировал hardness
как целое число, а точнее — как 32-разрядное целое число, поскольку 10 является коротким числом без десятичной точки (или запятой, которую мы используем в десятичной дроби).
Typeof — отличный диагностический инструмент, но если вы включаете его в программный код,
вы работаете против установки Crystal на управление представлением типа во время компиляции.
В большинстве случаев можно доверить Crystal определить подходящий тип переменной. Если вы хотите большей ясности в этом вопросе, вы можете подсказать компилятору, что именно вы хотите, и компилятор выполнит это для вас.
===
\листинг 3\...not (Int32 | String)
===
Как показано в первой строке, вы можете объявить переменную и ее тип,
прежде чем присваивать ей значение. Компилятор Crystal затем использует этот тип для вынесения решения о соответствии последующих операций присваивания.
Но эту переменную нельзя использовать ни для чего до момента, когда ей будет приписано значение. (Если вы явно определите тип переменной, Crystal позволяет вам присваивать ей различные виды данных, а компилятор будет соблюдать эти установки, если возможно.)
Вы можете также объявить и присвоить в одной строке кода, например
hardness : Int32 = 10. (Int32 - 32-разрядное целое число со знаком (+-); и не забудьте пробелы вокруг двоеточия.) Все же помните, что вы можете позволить Crystal создавать типы
переменных в большинстве случаев, и нет необходимости загромождать ваш код объявлениями типов.
При желании, вы можете также раздать значения множеству переменных за один раз.
===
fo...
===
Если вы хотите, вы также можете поместить несколько операторов на одну строку, если вы разделяете их с помощью точки с запятой.
===
fo...
===
Точка с запятой позволяет размещать на строке множество операторов любого рода, а не только
передавать значения переменным.
Если спешите, вы можете также "переключать", меняя местами значения двух однотипных переменных в какой-то строке:
===
crystal_
===
(Компилятор Crystal "за ширмой" создает временную переменную, чтобы выполнить этот маневр.)
Нормальные переменные, которые могут изменять значение, начинаются с строчных букв и
используются подчеркивания для пробелов, называемых "змеей" или боксом подчеркивания.
Константы, которые не могут менять значение, начинаются с букв верхнего регистра, и они традиционно пишутся во всех заглавных буквах с подчеркиванием для пробелов. Если вы пытаетесь установить для них значение после того, как они уже были установлены, компилятор Crystal будет протестовать.
===
foun...
===
Crystal также включает несколько резко ограниченных типов, которые полезны для логических операций. Булевы (относящиеся к логическому типу) переменные могут принимать значения true и false, тогда как nil (относится к типу Nil) явно указывает, что здесь нет никакого значения.
___
!! Not Global (Не глобальный).
Ruby поддерживает глобальные переменные, имена которых начинаются с $. Но переменные Кристалла всегда локально определены, и тут не бывает глобальных переменных.
Операции над переменными.
Теперь, поскольку у вас есть контейнеры для хранения значений, вы захотите сделать что-нибудь с этими значениями. Crystal предлагает традиционные математические операции, с несколькими вариациями, зависящими от того, выполняется ли обработка значений типа float или целых чисел. (Также можно смешивать числа с плавающей точкой и целочисленные).
===
\листинг\
...fdiv function)
===
В строках применяют оператор '+' для конкатенации, как и во многих ЯП.
===
foundat...
===
Конкатенация работает, но это неуклюжий инструмент. Первый элемент должен быть строкой, чтобы он вообще работал; и он откажет, если вы попытаетесь добавить число, в стиле Ruby.
К счастью, Crystal позволяет вам собирать строки более естественно, с интерполяцией.
===
found...
===
Crystal вычисляет значение любой синтаксической структуры #, при необходимости
преобразует его в строку, и сочетает с предыдущей строкой. Под этими операторами — ключевая правда Crystal: все эти значения по сути — объекты. Crystal преобразует универсальный синтаксис оператора для методов, облегчающих написание легко читаемого кода. Тип соответствует классу, что означает, что все эти значения имеют методы, которые можно использовать.
Например, size — это метод для объектов String, возвращающий количество символов в виде Int32.
===
foundations/opera...
===
Но size не является методом для значений Int32, поэтому компилятор выдаст ошибку (“undefined method ‘size’ on Int32”).
ВАШ ВЫХОД 1 (Практическое задание 1).
Проверьте и объясните выходные данные следующих операторов в Crystal Playground:
\задание\