2017-02-12 5 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(別名stringUnicode text)の値を返しますが、その後、あなたの二行目は、タイプintegerの値に対してそれを比較します。SANE、人道的な世界では

"3" = 3 

何ので、この比較はtrueを返しますあなた平均は明らかです。悲しいかな、プログラミングの世界はまじめではなく、人道的なことはまれであり、大部分の人間を欲求不満にまで抑えるレベルの歩道が必要です。この場合、2つの値を比較する前に、両方が同じ(または同等の)タイプであることを確認する必要があります。あなたが数値比較を実行したい場合たとえば、:時にはそれが自動的に変換(強制)を実行するため

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 (?) 

テキスト比較は、2つのテキストの値を比較文字バイしたがって、2番目のテストでは、 "3"が "5"の前に来るので、falseが返されます。(=)-等しく、()演算子-等しくないとは異なり

さらに、><、及びオペレータはそれらを比較する前に、同じタイプへのオペランドを強制か:

34 > "5" --> true 

"34" > 5 --> false 

どちらの場合でも、オペレータは、左オペランドと同じ型に右オペランドを強制的に変換してから、数値(最初の場合)またはテキスト(二番目の)規則に従って比較します。このような振る舞いは、言語設計上の瑕疵や「疣贅」として丁寧に記述することができます。あなたは左のオペランドがされる値の種類にもわからないが、それはルールの正しいセットを使用して比較され、絶対に確認するには

、最初にそれに適切な強制を適用します。

(variable1 as number) > 5 

(variable1 as text) > "5" 
+0

それはひどいかもしれない、あなたはWindows CMD.EXEになる可能性があります –

+0

応答に感謝します。今はとても分かりやすいようですが、おそらく私はそれを得ていないでしょう。あなたのご親切に感謝します! :) – user7439349

関連する問題