AppleScript 参考对象 - 帮助我理解它们

Ted*_*ton 5 applescript reference pass-by-reference appleevents

为什么这些甚至存在?这似乎很荒谬。与大多数动态语言一样,AppleScript 类型似乎是不可变的原始类型(如integers 和reals),它们将按值传递,与 一起使用没有任何意义a reference to,或者是类似对象的类型(如applications、scripts 或records,它们已经通过引用传递。怎样才算a reference to不完全多余呢?以下是摘自 Apple 的 AppleScript 语言指南 ( https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html )的示例:

tell app "Finder" to set diskRef to a ref to startup disk
--result: startup disk of application "Finder"
Run Code Online (Sandbox Code Playgroud)

那么你的意思是告诉我如果我这样做的话

tell app "Finder" to set diskObj to startup disk
--result: startup disk of application "Finder"
Run Code Online (Sandbox Code Playgroud)

applescript 运行时将向 Finder 进程发送一个 apple 事件,告诉它,“嘿 - 有人刚刚要求你将 /dev/disks01 的八位字节流返回给我!哈哈!我想他应该问一下为了a reference to它!让我们开始吧!这需要一段时间!”

我正在用 Python 编程,我这样做:

m = fileHandle.read( 1000000000 ) #and then wait a little while
n = m 
Run Code Online (Sandbox Code Playgroud)

我刚刚在内存中复制了一大堆数据吗?当然不是。但 AppleScript 中 的存在a reference to意味着将对象分配给新变量是按值操作。如果是这样的话,这个copy命令有什么用呢?

这里发生了什么?

更新:好吧,就当我是一个困惑的 Python 程序员吧。只是为了让这一点更清楚,我仍然认为

tell app "Finder" to set diskRef to a ref to startup disk
--result: startup disk of application "Finder"
Run Code Online (Sandbox Code Playgroud)

是一个很糟糕的例子(取自 applescript 语言指南)。但 @Chuck 的a reference to属性本身持有一个可以重新分配的原始类型的示例是一个更好的示例。IOW,reference对象实际上是一个变量/属性,它保存指向另一个变量或属性的指针。

Chu*_*uck 3

我的理解是,您可以将引用视为指针。

set x = 5
set y to reference to x
set contents of y to 10
log x -- 10
Run Code Online (Sandbox Code Playgroud)

通常,您不会手动创建引用。AppleScript 库和字典可能会返回它们,但随后您将使用返回项的属性(name of startup disk例如)。

老实说,我会忽略他们。在使用 AppleScript 的二十年中,我可能不得不查找一次文档以获取参考资料。如果您尝试在 AppleScript 中执行某些操作并认为需要创建引用变量,那么您可能没有以最直接的方式执行此操作。

查看这篇 MacTech 文章,了解有关 AppleScript 参考的更详细讨论。