2017-02-12 8 views
1

У меня есть программа, которая проверяет количество файлов в выбранном месте и затем отображает их. Но когда я попытался включить это в другую программу, это ошибка. Первоначально он работал, но теперь он говорит что-то, что истинно, ложно.сравнить переменные в ошибке Applescript?

set variable1 to do shell script "cd /Volumes; ls | wc -l" 
display dialog variable1 

Это была оригинальная программа и она рассказала мне количество файлов в моей папке томов было 3.

set variable1 to do shell script "cd /Volumes; ls | wc -l" 
variable1 = 3 

Но затем я попытался включить его в мою новую программу, и она это рассказала мне был ложным !!! ???

пожалуйста, если вы можете, помогите мне, как это невероятно сложно. Любая помощь велик и спасибо заранее! :)

ответ

1

Языки, подобные 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" 
+0

Это может быть хуже, вы можете быть в Windows CMD.EXE –

+0

Спасибо за ответ. это кажется настолько очевидным сейчас, но я, вероятно, никогда бы не получил его. Еще раз спасибо за вашу помощь! :) – user7439349