我有一个程序可以检查所选位置的文件数,然后显示它们。但是,当我试图将其纳入另一个程序时,它就会出错。最初它起作用但现在它说的是真实的东西是假的。
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
但后来我尝试将其纳入我的新程序,它告诉我这是假的??? ???
如果可以,请帮助我,因为这令人非常沮丧。任何帮助都很棒,并提前感谢!:)
答案 0 :(得分:2)
像AppleScript这样的语言对于数据类型(即数据的表示方式而不是实际意义的机制)是愚蠢的迂腐。 do shell script
命令返回类型text
(又名string
,Unicode text
)的值,但第二行会将其与类型integer
的值进行比较:< / p>
"3" = 3
在一个理智,人性化的世界中,这种比较会返回true
因为你意味着什么是显而易见的。唉,编程世界远非理智而且很少人性化,需要一定程度的迂腐,以减少大多数人的早期挫败感。在这种情况下,在尝试比较这两个值之前,必须确保两者都是相同(或等效)类型。例如,如果要执行数字比较:
set variable1 to (do shell script "cd /Volumes; ls | wc -l") as integer
variable1 = 3
AppleScript在这里引起了双重困惑,因为有时候它会自动执行转换(强制转换),而有时它则不会,在这种情况下你必须使用它的at
运算符来自己显式转换(强制转换)值。< / p>
...
哦,AppleScript执行数字比较的规则与执行文本比较的规则不同,所以即使在它将有助于&#34;有帮助的情况下也是如此。为你强迫你需要对你正在使用的值的类型保持警惕,否则你很容易被更狡猾和令人困惑的错误所困扰。
例如:
34 > 5 --> true
第一次测试按预期返回true
,因为数字34大于数字5.
"34" > "5" --> false (?)
文本比较逐个字符地比较两个文本值,因此第二个测试返回false
,因为&#34; 3&#34;来自之前,而不是之后,&#34; 5&#34;。
此外,与is-equal(=
)和is-not-equal(≠
)运算符不同,>
,<
,≥
,并且≤
运算符在比较它们之前将它们的操作数强制转换为相同的类型:
34 > "5" --> true
"34" > 5 --> false
在这两种情况下,操作符将其右操作数强制转换为与其左操作数相同的类型,然后根据数字(在第一种情况下)或文本(在第二种情况下)规则进行比较。这种行为可能被礼貌地描述为语言设计缺陷或“哇哇”。
如果您甚至不确定左操作数将是什么类型的值,但是想要确保使用正确的规则集进行比较,请首先对其应用相应的强制:
(variable1 as number) > 5
(variable1 as text) > "5"