Блочные среды визуального программирования похожи на троллейбусы. Пользователям кажется, что они тут главные, да и шофёр-разработчик делает вид, что это так, но на самом деле всё происходит в рамках заданных маршрутов - будьте любезны соединять блоки таким образом. И всё бы ничего, но среди пассажиров оказывается программист, которому захотелось на природу. "И как, уважаемый, мы осуществим это на троллейбусе?", - недоумевает шофёр. На что программист отвечает: "Так мы ему рога-то пообломаем, и поставим солнечные батареи. Не в море живём, руки имеются". Шофёр уходит пилить что-то для нового троллейбуса, а программист берётся за работу, не обращая внимания на недружественные взгляды большей части пассажиров, в которых читается вопрос, а нам-то это зачем? Затем, что это можно будет использовать на практике.
Встроенные блоки для создания программной логики распределены по категориям и для наглядности окрашены в разные цвета, чтобы пользователь видел, какие блоки предназначены для выполнения, например, математических операций, а какие для работы со списками. Такая наглядность совместно с контролем типов блоков помогает пользователям соединять друг с другам подходящие по типу блоки, но быстро приводит к формированию шаблонов и рамок: для работы с текстом предназначены только красные блоки, ассортимент которых определяет количество доступных операций. Если нужного блока нет, то либо пытаемся создать нужную функциональность самостоятельно, либо просим помощи на форуме.
Рассмотренная ситуация характерна для начинающих пользователей, которые хотят только создавать мобильные приложения и программирование их не интересует. Если же пользователь интересуется программированием и затратил время и усилия на изучение типов данных и преобразование типов данных, то рамки возможного заметно расширяются. Пользователь начинает соединять блоки осмысленным образом и может составить их так, как он не видел ни в одном доступном примере. С этого момента и начинается творчество.
Преобразование исходного типа данных позволяет расширить количество операций над ним и использовать для этого блоки из других категорий. В текстовом программировании используется перегрузка функций, когда определяются несколько функций с одинаковым именем, но разными параметрами. В Thunkable X невозможно создать две функции с одинаковыми именами, но можно использовать один и тот же встроенный блок с параметрами разных типов. Назовём это перегрузкой блоков.
Если посмотреть на блоки в категориях Text и List, то нетрудно заметить, что некоторые из них отличаются только цветом, например, блоки length of, is empty. Возникает вопрос, можно ли для подсчёта количества символов в строке использовать блок для вычисления длины строки? Можно! Некоторые блоки с одинаковым названием, похожим названием или похожим действием можно использовать с разными типами данных. Чтобы перегрузка блоков не привела к путанице нужно внимательно следить за типом данных параметров. Например, если блоку shuffle передать список, то он вернёт список его элементов в случайном порядке. Если же в этот блок передать сроку, то он вернёт список символов данной строки в случайном порядке.
Пример 1. Получение случайной цифры в строковом формате
var <- shuffle ( "0123456789" )
Пример 2. Получение случайной буквы алфавита
var <- "abcdefghijklmnopqrstuvwxyz"
var <- rundom item of list <- var
Пример 3. Создание списка индексов
var <- "abcdefghijklmnopqrstuvwxyz"
from List Viewer set text item <- var
Пример 4. Замена элементов списка
var <- list ("Peter") ("Kurt") ("Peter") ("Goron")
var <-
in text ( var ) replace all ( "Peter" ) with ( "Mike" )
var <- make list fom text ( var ) with delimiter ( "" )
Пример 5. Объединение списков
var1 <- list ("Peter") ("Kurt") ("Peter") ("Goron")
var2
<- list ("1") ("2") ("3") ("4")
var <- make list fom text ( join ( var1 ) ( "," ) ( var2 ) ) with delimiter ( "," )
Пример 6. Перебор символов в строке
var1 <- "Test"
var2 <- ""
for each item ( j ) in list <- var1
var2 <- join (var2) ( j )
Пример 7. Получение значения списка при помощи геттера объекта
var1 <- list ( 1 ) ( 2 ) ( 3 )
var2 <- get property ( 0 ) of ( var1 )
Пример 2 можно реализовать при помощи математического блока и блока для получения буквы по случайно полученному индексу, но для этого потребуется использовать больше блоков:
str < "abcdefghijklmnopqrstuvwxyz"
x < rundom integer from 1 to ( length of < str )
y < in text ( str ) get letter # ( x )
Показанные выше примеры можно использовать, например, при создании обучающих игр и викторин.
Блок для получения значения списка пи помощи геттера более привычен программистам, так как индексация массивоп производится от 0.Данный пример работает по той причине, что числовые индексы массива преобразуются в строковые числа, что можно использовать в качестве ключав геттере.
Большинство блоков для работы со строками из категории Text можно использовать для работы со списками. В этом случае список сначала может быть преобразован в строку с разделителями, а затем над ней будет произведена операция. Аналогично и большинство блоков для работы со списками можно использовать для работы со строками. В этом случае строка будет преобразована в список . Например, блок does contain применительно к списку будет искать подстроку в элементах списка, а не совпадение всей искомой строки с элементом списка, как при использовании блока does list contain.
Перегрузка функций возможна по причине близости природы этих данных. Строка - это коллекция (неизменяемая) символов, список - коллекция строк. Блоки, для работы со строками и списками на самом деле работают с коллекциями. Если в качестве коллекции указана строка, то блок вернёт букву по заданному индексу, а если список, то элемент списка по заданному индексу. Коллекция - это абстрактный набор данных, благодаря которому можно использовать одинаковые блоки для работы с данными разного типа. Это упрощает процесс программирования, и делает его более надёжным, устраняя дублирование кода.