Языки, подобные AppleScript, глупо педантичны в отношении типов данных (т. Е. Как представление данных, а не как то, что на самом деле означает). Команда do shell script
возвращает значение типа text
(ака string
, Unicode text
), но тогда ваша вторая линия сравнивает его со значением, типа integer
:
"3" = 3
В здравом гуманном мире, это сравнение будет возвращать true
, потому что вы среднее очевидно. Увы, мир программирования далек от нормального и редко гуманного, и требует уровня педантизма, который уменьшает большинство людей, чтобы отвлечься от разочарования. В этом случае, прежде чем пытаться сравнить два значения, вы должны обеспечить, чтобы оба они были одинаковыми (или эквивалентными) типами. Например, если вы хотите, чтобы выполнить численное сравнение:
set variable1 to (do shell script "cd /Volumes; ls | wc -l") as integer
variable1 = 3
AppleScript вдвойне запутанный здесь, потому что иногда он выполняет это преобразование автоматически (принуждение), в то время как другие времена это не так, и в этом случае вы должны использовать его at
оператора, чтобы явно преобразовать (бросить) значение самостоятельно.
...
О, и правила, по которым AppleScript выполняет числовые сравнения отличаются от правил, по которым он выполняет текстуальные сравнения, так что даже в тех случаях, когда это будет «услужливо» принудительным значение для вас вам нужно чтобы быть дополнительным оповещением о типе (типах) значений, с которыми вы работаете, иначе вы можете легко быть пойманы еще более хитрыми и запутанными ошибками.
Например:
34 > 5 --> true
Это первый тест возвращает true
, как и ожидалось, так как число 34 больше, чем число 5.
"34" > "5" --> false (?)
Сравнение текста сравнивает два текстовых значений символов в каждом конкретном символ, поэтому второй тест возвращает false
, потому что «3» приходит раньше, а не после «5».
Кроме того, в отличие от IS-равных (=
) и-не-равно (≠
) операторов, в >
, <
, ≥
и ≤
операторы делают принуждать их операнды к одному типу перед их сравнением:
34 > "5" --> true
"34" > 5 --> false
В обоих случаях оператор принуждает свой правый операнд к тому же типу, что и его левый операнд, прежде чем сравнивать их в соответствии с числовыми (в первом случае) или текстовыми (во втором) правилами. Такое поведение может быть вежливо описано как недостаток языкового дизайна или «бородавка».
Если вы еще не уверены, какой тип значения левого операнда будет, но хотят, чтобы быть абсолютно уверены, что это сравнивается с правильным набором правил, применить соответствующие принуждением к нему первым:
(variable1 as number) > 5
(variable1 as text) > "5"
Это может быть хуже, вы можете быть в Windows CMD.EXE –
Спасибо за ответ. это кажется настолько очевидным сейчас, но я, вероятно, никогда бы не получил его. Еще раз спасибо за вашу помощь! :) – user7439349