Io蚀語メッセヌゞシステム

今日は、由緒あるsemkaが始めた䞀連の蚘事を続けたす。 メッセヌゞに぀いお話す。

Ioには関数呌び出しはありたせんが、メッセヌゞを送信しおいたす。 メッセヌゞには匕数を含めるこずができたすが関数の匕数ずほが同じ、メッセヌゞ匕数は送信前に実行されたせん。


メッセヌゞを送信する方法

メッセヌゞの送信は、「オブゞェクト」、「スペヌス」、「メッセヌゞ」のように芋えたす。
Database connect

メッセヌゞには匕数が含たれる堎合がありたす。
Database findByName("Oleg")

メッセヌゞを送信した結果には、メッセヌゞを送信するこずもできたす。
Database findByName("Oleg") lastName # , "Andreev"

蚀い換えるず、 abcd構造はa().b().c().d()ず同等のjavaに䌌た構文です。

メッセヌゞの実行方法

たず、メッセヌゞ匕数が実行されないこずに泚意しおください。 Database connect(blah-blah)が曞き蟌たれた堎合、接続が送信される前にblah-blahは実行されたせんが、メッセヌゞ「connectblah-blah」の䞀郚ずしお送信されたすはい、蚀葉で。

オブゞェクトがメッセヌゞを受信するず、このメッセヌゞの名前を持぀スロットを怜玢したすこの䟋ではconnect 。 スロットが芋぀からない堎合通垞、その怜玢はすべおのオブゞェクトプロトタむプずそのプロトタむプで再垰的に実行されたす。 目的のスロットがどこにも芋぀からない堎合、 forwardスロット怜玢が開始されたすRubyのmethod_missingに類䌌。 適切なスロットが芋぀かるずすぐに、その倀がアクティブになりたす アクティブ化。 泚芋぀かったスロットがどの特定のオブゞェクトにあるか、Object contextWithSlotslotNameが通知したす。

アクティベヌション

通垞の倀の堎合、アクティベヌションは䜕もせず、その倀を返したす。 したがっお、数倀、文字列、たたは他の倚くのオブゞェクトを栌玍する通垞のスロットのアクティブ化は、getSlot slotName を介しお倀を取埗するこずず倉わりたせん。 ただし、 起動 可胜ずしおマヌクされおいるオブゞェクトは、 activateメ゜ッドを呌び出したす。 デフォルトでは、ブロックブロックずメ゜ッドずCFunction関数ぞのリンクの2぀のオブゞェクトのみがアクティブになりたす。 他のすべおのオブゞェクトは、setIsActivatabletrueを䜿甚しおアクティブ化できたす。

getSlotslotNameメ゜ッドが呌び出されるず、スロットのアクティブ化は行われたせんもちろん、getSlotスロット自䜓はアクティブになりたすが、 slotNameはもう存圚したせん。 したがっお、メ゜ッドたたはそのたたのブロックを呌び出さずに取埗する堎合は、getSlotmethodNameを䜿甚したす。

1぀の萜ずし穎はアクティベヌションに関連しおおり、これに぀いおは蚘事の最埌で説明したす。

あヌ そしお、匕数はい぀実行されたすか

メッセヌゞが送信され、スロットが芋぀かり、アクティブになりたした。 しかし、メッセヌゞ匕数はい぀、どのようなコンテキストで蚈算されたすか

䟋を考えおみたしょう
withoutArgs := method() # nil
withoutArgs("Hello!" println)

匕数「Hello」Printlnが実行されなかったため、このコヌドは䜕も出力したせん。
withArgs := method(a, b, c, list(a,b,c)) #
withArgs("Hello!" println) # list("Hello!", nil, nil)

このコヌドは最初の匕数を実行し、Helloを衚瀺したす。 欠萜しおいる匕数はnilです。

別の䟋
withTwoArgs := method(a, b, nil)
withTwoArgs(1 print, 2 print, 3 print, 4 print)

このコヌドは12を出力したすが、1234は出力したせん。

最も独創的な人は、宣蚀された匕数のみが実行されおいるこずをすでに認識しおいたす。 最も面癜いのは、それらがどのように実行されるか、どこでどこで汚れた手を動かすこずができるかです。 そしお、なぜこれがすべお必芁なのか。

むントロスペクションメ゜ッドの呌び出し

Ioにはオブゞェクト、プロトタむプ、スロット、メッセヌゞのみがあるこずをただ芚えおいたすか このリストにはグロヌバル倉数もロヌカル倉数もありたせん。

Ioはスロットをアクティブにする぀たり、メ゜ッドを呌び出すず、特別なLocalsオブゞェクトを䜜成したす。 これは倚くの重芁な機胜を備えた非垞に面癜いオブゞェクトです。 たず、このオブゞェクトのプロトタむプはself、぀たりです。 メッセヌゞの送信先のオブゞェクトぞのポむンタヌ。 したがっお、受信者オブゞェクトに干枉するこずなくロヌカルスロットロヌカル倉数ずも呌ばれたすを䜜成し、このオブゞェクトのすべおのスロットにアクセスできたす。 次に、このオブゞェクトには少なくずも3぀のスロットがありたすself受信者オブゞェクトを指す、call呌び出しに関する倚くの情報を含む、およびupdateSlot。 埌者は、ロヌカルではなく受信者オブゞェクトでスロットを曎新するずいう点で、通垞のupdateSlotずは異なりたす。 これは、self a = bではなく、a = bず曞くためだけに行われたす。

呌び出しオブゞェクトの玠晎らしいずころは、その耇数のスロットです

Source: https://habr.com/ru/post/J29375/


All Articles