Section 9.5. Pass by Reference


9.5. Pass by Reference

Parameters passed to a handler, and the value returned from a handler, are normally passed by value in AppleScript. This means that a copy of the value is passed to, and used by, the handler code.

But four datatypeslists, records, dates, and script objectswhen they are passed as parameters to a handler, are passed by reference , meaning that no copy is made; the handler and the caller both end up with access to the very same value. These are the only mutable datatypesthe only datatypes whose values can be modified in place. Whatever mutation is made to the parameter by the handler applies to it in the context of the caller as well. (Compare "Set by Reference" in Chapter 7.)

Here's an example showing that a list is passed by reference:

 on extend(LL)     set end of LL to "Jack" end extend set L to {"Mannie", "Moe"} extend(L) L -- {"Mannie", "Moe", "Jack"}

Even though the caller didn't capture the value of the handler call extend( ), and even though the caller didn't change L, and even though the handler extend never speaks explicitly of L, yet after the call, L has changed in the caller's context. The handler extend was able to modify L.

Here's an example showing that a script object is passed by reference:

 script myScript     property x : 10 end script on myHandler(s)     set s's x to 20 end myHandler myHandler(myScript) display dialog myScript's x -- 20

It makes sense that these datatypes can be passed by reference, but it is a little disturbing that they are passed by reference automatically, without giving you any choice in the matter. Passing by reference gives the handler great power over the parameter, which the handler can misuse. So, to prevent accidents, it is up to you to remember that list, record, date, and script object parameters are passed by reference, and that things you do in a handler to such parameters have an effect outside the handler. If you wish to avoid this, then if you like you can pass them by value, by making a copy and passing the copy:

 on byValue(x)     copy x to y     return y end byValue on extend(LL)     set end of LL to "Jack" end extend set L to {"Mannie", "Moe"} extend(byValue(L)) L -- {"Mannie", "Moe"}

What about values that are not lists, records, dates, or script objects? How can they be passed by reference? They can't. Well, sometimes they can, but only in situations where it is pointless to do so. See "Reference as Parameter" in Chapter 12.




AppleScript. The Definitive Guide
AppleScript: The Definitive Guide, 2nd Edition
ISBN: 0596102119
EAN: 2147483647
Year: 2006
Pages: 267
Authors: Matt Neuburg

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net