DroidScript
DroidScript
инструменты для мобильной разработки

Преобразование типов данных

Базовый курс программирования на Thunkable X  
11.10.2019

Как вы уже знаете, переменные в Thunkable X за время своего существования могут принимать данные разных типов. Сначала к её блоку можно присоединить числовой блок, затем текстовой и т.д. Но внутренние механизмы работы приложений на устройствах требуют того, чтобы им были переданы данные определённого типа. В противном случае приложение может даже потерпеть крах. Ядро Thunkable X, казалось бы, должно иметь надёжную защиту от использования данных неподходящего типа, но на практике встречаются комбинации блоков, когда она не работает. Для повышения надёжности и стабильности работы приложений наряду с типами данных необходимо понимать то, как, кем и для чего производится преобразование типов данных

Смотрите пример ”Type conversion”.

В практических задачах необходимость преобразования значения из одного типа данных в другой встречается постоянно. Например, блок сложения не позволит использовать блоки строк для выполнения операции “100$” + “20$”. Для выполнения данной операции эти строки необходимо преобразовать в числовой тип и сложить их как 100 + 20.

Преобразование типов в Thunkable X может происходить автоматически (неявно) или вручную (явно).
Автоматическое преобразование происходит, например, в случае присоединения числового блока к блоку установки текста кнопки или присоединение блока получения надписи на кнопке в математическую операцию. Однако, логический блок false присоединить к текстовому входу уже не получится. Для осуществления этой операции вначале блок false необходимо присоединить к блоку переменной, а затем данный блок переменной к текстовому входу. Запомните этот приём:

если невозможно присоединить два блока друг к другу, то используйте вспомогательный блок переменной

Автоматическое приведение типов не требует усилий от программиста, но во избежание появления ошибок программист должен чётко понимать, какой тип данных находится в блоке и следить за этим.

У начинающего пользователя может возникнуть вопрос, для чего производится автоматическое преобразование типов? Это же вносит путаницу: записал значение одного типа, а получил значение другого типа! Ответ может удивить - для удобства программирования. Предположим, автоматического преобразования типов нет. В этом случае разработчику придётся каждый раз вручную добавлять преобразования данных из одного типа в другой, что потребует много лишней работы. В качестве примера посмотрите на блоки компонентов. В них из выпадающих списков нужно выбрать компонент и свойство. А представьте, насколько проще было с ними работать, если бы эти значения можно было задавать при помощи переменных. Это увеличит вероятность появления ошибок, но зато позволит при помощи всего одного блока заменить несколько сотен блоков в определённых задачах.

Преобразование в число

Для преобразования в число можно использовать любой подходящий блок математической операции. Я предпочитаю использовать блок сложения с нулём.

Если строка начинается с цифр, то она автоматически преобразуется к числу, в противном случае возникнет значение ошибки NaN (не число):

“10$” в 10
“0.1degree” в 0.1
“age34” в NaN
"" в NaN или 0

При использовании пустой строки в математической операции её результатом будет NaN, а при использовании в математической функции - 0. Поэтому cos("") = 1. При испоьзовании математической операции не происходит автоматического преобразование в число, в отличие от использования математической функции. Перед выполнением математической функции необходимо делать проверку передаваемого ей аргумента на неравенство пустой строке.

Все остальные типы явно преобразовать в число нельзя. Попытка их использовать в математических операциях вернёт NaN за исключением списка, если его первый элемент является числом или строкой, которую можно преобразовать в число. В этом случае для участия в математической операции будет выбран первый элемент списка.

Преобразование в строку

Для преобразования значения в строку используется блок join. При этом:

  • Числа преобразуются в их строковый эквивалент: 10 в “10”, Infinity в “ Infinity”  -2e3 в “-2e3”
  • Булевы значения - в строковый эквивалент: false в ”false”, true в “true”
  • Color – в строку RGB в шестнадцатеричном формате, например, “#ff0000”
  • undefined – в пустую строку “” или строку ”undefined”, если вместо блока join используется блок generate JSON from object. При этом блок generate JSON from object не преобразовывает тип undefined в строковый тип “undefined”. Преобразовать undefinedв строковый тип можно путём присоединения этого блока к компоненту Label.Text
  • NaN – в “NaN”
  • null – в “null”.
  • Объект - строку “[object Object]”
  • Список – в строку с разделителями (для этого существует специальный блок)
  • UUID - в строку UUID

Преобразование в логический тип

Для преобразования в логический тип используется последовательность из двух блоков not.

  • Любое ненулевое значение, включая бесконечности – в true
  • Любая непустая строка в true, пустая в false
  • null – в false
  • Color – в true
  • Любой объект (включая пустой) – в true
  • Любой список (включая пустой) – в true

Автоматическое преобразование различных значений в булев тип позволяет упростить алгоритм, уменьшить количество блоков и сделать его более понятным. Например, нет необходимости использовать блок сравнения значения переменной с 0, пустой строкой или null. Вместо блока if < var var = 0, который будет выполнен, еcли значение этого выражения равно true, можно использовать блоки if < not < var.

Преобразование в объект

Преобразовать в объект можно только строку в корректном формате JSON. Для этого используется соответствующий блок. Если вам нужно преобразовать JSON в объект, то вначале убедитесь в том, что JSON составлен корректно. В Интернете можно найти много страниц для проверки этого.

Преобразование в список

Преобразовать в список можно текст с разделителями или строку в корректном формате JSON. В последнем случае список будет содержать объекты. Для выполнения этих преобразований предназначены специальные блоки.

Преобразования данных в undefined и null не производят, поскольку эти типы представляют собой специальные значения.

Операции сравнения

Для выполнения операция сравнения используются блоки >, >=, <, <=, =, ≠. Использовать эти операции несложно, но при этом нужно быть очень внимательным, так как при использовании этих операторов происходит преобразование типов, в результате которого можно получить неожиданный результат.

Логическое значение true преобразуется в 1, а false – в 0.

false = 0 - true
true > false – true (1 > 0)

При сравнении строк с другими типами данных происходит попытка преобразовать их в строки:

“9” < 20 – true
”1” = true - true
“9” > “100” (здесь сравниваются операторы одного типа, поэтому преобразования к числам не происходи)

Если преобразовать строку в число невозможно, то операция преобразования вернёт значение NaN, которое при любых сравнениях возвращает false:

“Test” = 10 - false
NaN = NaN – false
NaN ≠ NaN – false

Сравнение чисел происходит путём сравнения их значений:

100 > 10 =  true
-5 < -4 = true
При сравнении строк  учитывает порядок символов в таблице символов Юникода:

“б” > a - true
z < t - false
Tes  < Tet - true
Hello > Hell - true (более длинная строка больше)

Если операнды имеют разный тип, то желательно явным образом преобразовать их к одному типу.

Для проверки значения выражения на равенство NaN необходимо это выражение приобразовать к строке, которую затем сравнить со строкой “NaN”.

При сравнении с null и undefined нужно быть особенно внимательным.

undefined = null – true, это специальное правило: данные значения равны друг другу, и не равны больше никакому другому значению, кроме себя:

undefined = undefined - true
null = nulltrue
null = 0 – false
undefined = “” - false

При использовании операторов сравнения >, >=, <, <= с математическим операндом, значение null преобразуется к 0:

null > 0 – false (null преобразуется к 0)
null = 0 – false (преобразования к 0 не происходит, работает специальное правило)
null >= 0 – true (null преобразуется к 0)

При использовании операторов сравнения >, >=, <, <= с математическим операндом, значение undefined преобразуется к NaN, поэтому:

undefined > 0 – false (undefined преобразуется в NaN)
)
undefined < 0 – false (undefined преобразуется в NaN)
undefined = 0 – false (работает специальное правило)

Базовый курс программирования на Thunkable X  
© 2016-2018 Александр Страшко