暗黙の型変換

暗黙の型変換とは

 暗黙の処理は色々とありますが、ここでは特に値の型変換(cast)を中心に取り上げます。暗黙の型変換とは、as演算子を使わない型変換とします。
 AppleScriptは結構大雑把に違う種類の値を置いても適当に変換してくれることが多いので、ついつい値の型をあまり確認せずに使いがちですが、そこには危険も潜んでいます。
 他の暗黙の処理については「暗黙と明示」を参照して下さい。また、明示的な値の変換については「値の変換表」を参照して下さい。

数値(number)の変換

 整数と小数点以下が0の実数との演算の場合、演算の結果は小数点以下が付かない数値となるのですが、その場合には結果は整数と実数のどちらのクラスとなるのでしょうか。
 まず、+ 演算子について考えてみます。
 左に実数、右に整数の場合、結果は実数(real)になります。

class of (2.0 + 1)
--> real

 左に整数、右に実数の場合、結果は整数(integer)になります。

class of (1 + 2.0)
--> integer

 つまり演算子の左辺の型にあわせられるわけです。
 - 演算子* 演算子mod 演算子に変えても同じ結果となります。
 / 演算子^ 演算子の場合は常に実数(real)です。
 div 演算子は常に整数(integer)です。これを利用した「数値を丸める」テクニックもあります。

&による結合

 基本的には、&演算子による結合はリストに変換されます。
 これは変換と言うよりも、合成されると言うべきかもしれません。

(1 & 2.0)
--> {1, 2.0}
class of (1 & 2.0)
--> list

 数値と文字列などでも同様です。

3 & "4"
--> {3, "4"}

 文字列として結合したい場合は、明示的にas演算子を使って型変換を行います。

(3 as string) & "4"
--> "34"

 ただし、左が文字列で、右が文字列に変換可能ならば、暗黙に文字列に変換されて結合されます。

"3" & 4
--> "34"

 文字列どうしを結合してリストにしたい場合は、直接&演算子で結合すると文字列になってしまうので、とりあえず左辺をリストとして書きます。

{"3"} & "4"
--> {"3", "4"}

 最初からリストの形で書くほうが素直だと思いますが。

{"3", "4"}
--> {"3", "4"}

 以上のように、結合の規則は面倒なので、別のクラスの値を結合する場合は、暗黙の変換に頼らず、きちんと明示するのがいいでしょう。

文字列を引数とする命令

 display dialog命令に文字列以外の値を渡すと暗黙に変換しようとします。
 ですから、次のように整数を渡しても大丈夫です。

display dialog 1

 しかし、次のようなスクリプトを実行すると「{1, 2}をstringに変換することはできません」とのエラーが出ます。

display dialog {1, 2}

 ところが、変換を明示しておけばエラーとならないのです。つまり、stringに変換できないというエラーは「AppleScriptが変換できないのではなく、display dialog命令が変換できない」わけです。

display dialog {1, 2} as string

 また、暗黙の変換はdisplay dialog命令の方で処理しているので、他の命令で変換してくれるかどうかは分かりません。
 例えば、choose file命令の場合、数値を渡しても無視します。

choose file with prompt 5

 別のクラスの値を渡すと、有無をいわさずエラーにする命令もありますし、エラーを出さず、いきなり止まってしまうタチの悪いものもあります。
 そんなわけで、指定されたクラス以外の値を命令に渡す前に、明示的に変換しておく方が無難と言えます。

リストを引数とする命令

 リストを引数とする命令に、リストにしていない値を単体で与えても大丈夫なことが良くあります。
 例えば、choose from list命令です。

choose from list "文字列"

 他にchoose file命令のof typeオプション等でもリストで無くても大丈夫です。

choose file of type "TEXT"

 単体の値をリストに変換してくれる可能性は、先ほど上げた命令が値を文字列に変換してくれる可能性よりもずいぶん高いようで、リストで渡していいものは、大抵は単体の値で渡しても大丈夫のようです。
 ただ、命令がそのように設計されているかどうかは、命令を設計した側にまかされています。暗黙の変換に頼らない方がいいことは言うまでもありません。

file参照

 aliasに変換せずにpath文字列を渡せば良きに計らってくれる命令は結構あります。
 例えば、次の命令は問題なく実行されます。

tell application "Finder"
	open "Macintosh HD:"
end

 ところが、全てがそうであるわけではありません。
 select命令はaliasを受け付けます。

tell application "Finder"
	select alias"Macintosh HD:"
end tell

 ですが、次のようにpath文字列を渡したら、エラーとなります。

tell application "Finder"
	select "Macintosh HD:"
end tell

 通常、file参照は直接変数に代入することはできません。
 ところが、Finderのほうで「Finderのオブジェクトによる参照」に変換してくれるので、tell "Finder"ブロックの中では代入できます。
 次のスクリプトを実行して結果を見れば、確かに変換されていることが確認できます。


tell application "Finder"
	set x to file "Macintosh HD:textFile"
end tell
--> file "textFile" of startup disk of application "Finder"

 またOSAXのほうで、file参照を変数に代入できる型に変換している場合もあります。
 その場合、次のスクリプトは実行可能となります。逆にいえばOSAXを取り出すと使えなくなるわけなので、極力このようなOSAXに頼った値の変換は利用しない方がいいでしょう。


set x to file "Macintosh HD:"
tell application "Finder"
	open x
end tell

 一応、a reference to演算子で、file参照をそのまま代入することもできますが、上手く動かないことが多く、今一つ実用的ではありません。
 alias値を利用するか、path文字列を利用する方が無難でしょう。


set x to alias "Macintosh HD:"
tell application "Finder"
	open x
end tell

 結局、「暗黙の型変換には頼らない」というのが、当たり前ですが確実な方法です。


2001-09-01