4

なぜこれらが存在するのですか?ばかげているようです。ほとんどの動的言語と同様に、AppleScript型は、値によって渡されて使用する意味がないintegersやsのような不変のプリミティブ型、またはs、s、s、これはすでに参照によって渡されています。どのように完全に冗長ではありませんか?これは、AppleのAppleScript言語ガイド(リンクを失った場合はhttp://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html )から抜粋した例です。reala reference toapplicationscriptrecorda reference to

tell app "Finder" to set diskRef to a ref to startup disk
--result: startup disk of application "Finder"

それで、私が代わりにこれをした場合、あなたは私に言うつもりですか?

tell app "Finder" to set diskObj to startup disk
--result: startup disk of application "Finder"

applescriptランタイムは、Finderプロセスに送信されるアップルイベントを送信して、「ねえ、/ dev / disks01のオクテットストリームを返してほしいと頼まれた人がいます!ハハ!彼は尋ねるべきだったと思います。a reference to始めましょう!これにはしばらく時間がかかります!」

私はPythonでプログラミングしていて、これを行います。

m = fileHandle.read( 1000000000 ) #and then wait a little while
n = m 

ギグのデータをメモリにコピーしただけですか?もちろん違います。ただし、a reference toAppleScriptに存在するということは、オブジェクトを新しい変数に割り当てることが値による操作であることを意味します。その場合、copyコマンドはどうなりますか?

何が起きてる?

更新:まあ、私を混乱したPythonプログラマーと考えてください。これをもう少し明確にするために、私はまだ思います

tell app "Finder" to set diskRef to a ref to startup disk
--result: startup disk of application "Finder"

悪い例です(applescript言語ガイドから引用)。ただし、@ Chuckの、a reference to再割り当て可能なプリミティブ型を保持するプロパティ自体の例の方が優れています。IOW、referenceオブジェクトは実際には別の変数またはプロパティへのポインタを保持する変数/プロパティです。

4

2 に答える 2

3

私の理解では、参照はポインタと考えることができます。

set x = 5
set y to reference to x
set contents of y to 10
log x -- 10

一般に、参照を手動で作成することはありません。AppleScriptライブラリとディクショナリはそれらを返す場合がありますが、その後、返されたアイテムのプロパティを操作します(name of startup diskたとえば)。

正直なところ、私はそれらを無視します。AppleScriptを使って20年間働いてきたので、おそらく一度は参照用のドキュメントを調べなければならなかったでしょう。AppleScriptで何かをしようとしていて、参照変数を作成する必要があると思われる場合は、おそらく最も簡単な方法でそれを行っているわけではありません。

AppleScriptリファレンスの詳細については、このMacTechの記事を確認してください。

于 2011-04-28T20:59:56.023 に答える
2

Pythonのように、AppleScriptの2つの変数は、同じ値を共有できます。各変数にはその値への参照がありますが、「参照」という言葉には他の意味があります。文字列"https://stackoverflow.com/"はWebサイトへの参照です。整数42はダグラス・アダムズの作品への参照です。AppleScriptのクラスのオブジェクトはreference別の種類の参照です。

クラスのオブジェクトは、referenceあるオブジェクトの要素またはプロパティへのアクセスを延期します。AppleScriptは、Pythonのラムダのようなものです。

set v to {11, 22, 33}
set r to a reference to item 2 of v

Pythonのように機能します

v = [11, 22, 33]
r = lambda: v[1]

リストの2番目の項目へのアクセスを延期する。次にcontents of r、AppleScriptまたはr()Pythonでアイテムを取得します。AppleScriptは、set contents of r to 99;でアイテムを設定することもできます。Pythonはこのラムダでアイテムを設定できません。Pythonのラムダは、AppleScriptの参照では実行できない多くのことを実行できます。

a reference toオペレーター

AppleScript言語ガイドではa reference toオペレーターについて説明していますが、いくつかの重要な詳細が欠落しています。演算子には1つのオペランドがあります。reference OPERANDコンパイラはまたはを受け入れref OPERAND、それらを。として書き換えますa reference to OPERAND

オペランドがまたはの形式の式である場合、演算子は式A of BB's Aクラスのオブジェクトにラップしますreference。この式は、のような要素、item 2 of qまたはのようなプロパティにすることができますlength of q

オペランドが変数の場合、演算子は暗黙的myまたはof meを付加します。たとえばa reference to q、実行ハンドラーでは。と同じa reference to my qです。qこれは、とmy qが異なるスコープでは混乱を招きます。

他のオペランドの場合、演算子はオペランドのみを返します。たとえば、のクラスのオブジェクトではないa reference to 33を返します。reference

オペレーターは、変数の現在の値を取得します。たとえば、a reference to item i of qiとqの値をキャプチャします。対照的に、a reference to qqはと同じであるため、qの値をキャプチャしませんa reference to my q。したがって、qは変数ではなく、プロパティと見なされます。

to demo()
    set q to {11, 22, 33}
    set rq to a reference to q
    set i to 2
    set ri to a reference to item i of q
    set i to 3
    set item 2 of q to 55
    set q to {77, 88, 99}
    {contents of rq, contents of ri}
end demo

set q to "a string"
demo()

このスクリプトの結果は{"文字列"、55}です。参照rqはローカルqを無視しmy q、実行ハンドラーから使用されました。参照riは、iとqのローカル値をキャプチャし、後でiとqへの割り当てを無視しましたが、qの項目2への割り当てを無視しませんでした。

大きなリストでの参照の使用

AppleScript言語ガイドには、a reference to演算子を使用して大きなリストへのアクセス速度を上げる例もあります。ガイドは使用します

set bigListRef to a reference to bigList

ただし、参照が暗黙的に行われることを説明できないa reference to my bigListため、アクセスはスクリプトオブジェクトを介して行われますme。これは、コードが実行ハンドラーにあるためにのみ機能します。ここで、bigListmy bigListは同じリストです。

参照が任意のスクリプトオブジェクトを通過する場合、大きなリストへのアクセスは高速であることがわかります。他のアクセスは遅いです。次のスクリプトは、高速アクセスを使用して7000アイテムのリストを作成し、低速アクセスと高速アクセスの両方を使用してリストを読み取ることにより、これを示しています。

to bench(what)
    set start to current date
    repeat with i from 1 to 7000
        if item i of what is not 42 then
            error "wrong value"
        end if
    end repeat
    (current date) - start
end bench

to bench2()
    script box
        property nums : {}
    end script
    repeat 7000 times
        set end of box's nums to 42
    end repeat
    {bench(box's nums), bench(a reference to box's nums)}
end bench2

bench2()

このスクリプトは、PowerPC Mac OSX10.4.11を実行している古いマシンで実行しました。結果は{19、0}だったので、低速アクセスには19秒かかり、高速アクセスには0秒かかりました。

回線は、オペレーターset end of box's nums to 42を使用せずに高速アクセスを実行します。アクセスはスクリプトオブジェクトa reference toを経由するため、高速です。box

于 2017-10-23T21:10:58.087 に答える