- Ulf H
- Medlem ●
- 2004-05-01 16:46
Problemet är bara att dialog inte visar hela sanningen...
Om jag använder en construct enligt
repeat with variable name in list
Exempel:
repeat with x in {1,2,3}
..
end repeat
Så är det inte siffran 1,2,3 jag tittar på det är innehållet i listan
dvs
item 1 (of {1,2,3})
item 2 (of {1,2,3})
item 3 (of {1,2,3})
repeat with <variableneme> in <list> är beskriven som
"This construct is like a repeat, but the variable <variablename> is assigned
successively a reference to each item of the list"
När du gör display så ser du referensen dvs item 1 visas som 1 men det är
inte det integer värde som du jämför med i din lista. Det är därför man i
detta fall (vilket jag håller med om är inkonsekvent) måste kolla på innehållet
i listan i stället för referensen till innehållet i listan.
dvs if x is 3 then
Ska utläsas som
if "item 3 of {1,2,3}" is 3 then , vilket är false,
inte som man skulle tro (eller vill att det ska vara)
if "cast(item 3 of {1,2,3}) to integer" is 3
och därför fungerar istället
if n as integer is 3
eller alternativt
if contents of x
Att vi pratar om referenser och inte faktiska värden dvs integer
Går faktiskt att visa. Via Apples Discussion Forums hittade jag en bra
metod att kunna testa detta i AppleScript.
Genom att använda en liten "debugger" metod kan man testa om
man jobbar med referenser eller faktiska värden. Denna method
kallar vi isRef()
(* This method test if we are using a reference to a value or not *)
on isRef(TestIfRef)
try
TestIfRef as reference
return true
on error
return false
end try
end isRef
repeat with x in {1, 2, 3}
display dialog isRef(x)
end repeat
Detta problem är tydligen också
dokumenterat som förväntat beteende i "Applescript The
Definitive Guide" från O'Reilly. Jag har inte boken själv
men tipset ovan med isRef() som jag fick via någon person
från Apple's Discussion Forum refererade till denna bok.
Någon som kanske har boken kan verifiera om detta är
sant eller inte.
Men det hindrar ju inte på något sätt att Du kan rapportera
detta som ett dåligt beteende i AppleScript. Jag funderar
själv på att göra det. Det är ju ett bra sätt att se till att
Applescript blir bättre och mer ur användares ögon mer
lätt använt. Eller att dokumentationen fås en genomgång.
Jag vet att Sal Soghoian (Applescript Product Manager) har
sagt att han är medveten om att dokumentationen inte
är i fas med själva funktionaliteten. Men att man internt
många gånger måste fokusera på att i första hand få
funktionaliteten att fungera och därmed blir ibland dokumentationen
lidande.
Referenser är faktiskt ett litet helvete i AppleScript för det är rätt
inkonsekvent när Applescript själv kan göra en implicit derefernce
(normalt vad man kallar cast) mellan en datatyp till en annan
och att man inte dokumenterar detta. Det behöver således inte
vara en "bug" i ordets rätta bemärkelse utan kass dokumentering.
Jag håller fullständigt med om
att det är tokigt att '>' , '<' fungerar annorlunda än '='. Konsekvent sett
så skulle ingen av ovanstående fungera utan att man
själv gör en explicit dereference till innehållet om man utgår från
det resonemang som jag lärt mig är det rätta.
Mvh
/Ulf