有谁知道为什么这个AppleScript有效?我不懂为什么。该脚本生成三个包含相同消息的对话框:“Hi There”。我有两个问题:
1)在定义i之前,如何将j和k设置为参考i?
2)为什么不引用test2中定义的i?
on test1()
return get a reference to i
end test
on run
set j to test1()
set k to a reference to i
set i to "Hi there"
display dialog j
display dialog k
test2()
end run
on test2()
set i to "now see here"
set r to a reference to i
display dialog r
end test2
注意:脚本编辑器是版本2.7,AppleScript版本是2.4。
答案 0 :(得分:1)
您只能创建对象属性或元素[s]或全局变量(一种令人讨厌的错误特征,其行为与设计糟糕的属性)的引用,而不是局部变量。例如这些都有效:
on test2()
set x to {i:"now see here"}
set r to a reference to i of x
display dialog r
end test2
test2()
on test3()
set x to {"now see here"}
set r to a reference to item 1 of x
display dialog r
end test3
test3()
on test4()
script x
property i : "now see here"
end script
set r to a reference to i of x
display dialog r
end test4
test4()
property i : "now see here"
on test5()
set r to a reference to i
display dialog r
end test4
test5()
隐式或显式run
处理程序中的所有变量都是全局的(另一个错误的特性),除非明确声明local
。这两个错误功能的组合是您的run
处理程序示例有效的原因,即使它看起来不应该这样。
答案 1 :(得分:0)
您基本上不想在脚本中创建“引用”。该类存在,因为命令返回引用是很常见的。我能想到使用它的唯一好处是你可以创建对象的引用,而不会明确给出对象的类和值。然后,您可以稍后定义对象。
因此,在您的示例中,您可以创建对象的引用,然后再创建它。
在test2处理程序中,引用是一个全局上下文,因此它在运行处理程序中查看标识符i,而不是在test2处理程序中。
我真的建议不要在你的脚本中使用它们。您认为需要的背景是什么?
答案 2 :(得分:0)
我觉得foo在11月18日回答了我的第二个问题。关于第一个问题,我将提供自己的解释,我在阅读了Object Specifiers之后看到了这些解释。以下语句取自我的示例,包含隐式of (get me)
。
return get a reference to i
为了说明,我将明确重写该陈述。
return get a reference to i of (get me)
当执行这些语句中的任何一个时,将创建一个包含对象说明符的引用对象。 a reference to
和get
之间的短语是未评估,而是存储在对象说明符中。在这种情况下,短语是i of
。评估get
右侧的内容,此结果也存储在对象说明符中。在这种情况下,此结果为me
,它是顶级脚本对象。这就是当从i
处理程序返回引用对象时,变量test1
不必存在的原因。执行display dialog j
语句时,将完全评估引用对象。此时变量i
必须存在。同样的解释可以应用于我的示例中显示的变量k
。
我确实意识到稍后要评估的文本短语可能实际上并不存储在对象说明符中。至少,我知道这个短语已经过解析和语法检查,但AppleScript语言指南并没有明确说明如何存储语句的未评估部分。
对我来说,隐含get
的位置似乎有点武断。让我用一些例子说明我的观点。 (为简洁起见,我省略了证据。如果读者无法验证,请告知我,我将提供证明)
示例1:如果你写
set r to a reference to i
你得到了
set r to get a reference to i of (get me)
示例2:如果你写
set r to a reference to item 2 of i
你得到了
set r to get a reference to item 2 of (get i of me)
示例3:如果你写
set r to a reference to i of me
你得到了
set r to get a reference to i of (get me) -- same as Example 1
示例4:如果你写
set r to a reference to item 2 of i of me
你得到了
set r to get a reference to item 2 of i of (get me) -- differs from Example 2
如果您希望设置对象的引用内容,我发现了以下限制。对象说明符包含的短语中in
和of
个保留关键字的数量必须等于1。总计零或多于一个将导致脚本执行错误。以下示例说明了这一点。
property j : {1, 2, {3, 4}, {{5, {6, 7}}, 8, 9}}
log "Line 1: " & j
set r to a reference to item 3 of j -- phrase is "item 3 of", object is (get j of me)
set contents of r to "aa" -- Succeeds since total count is 1
log "Line 2: " & j
set r to a reference to item 2 of (get item 1 of item 4 of j) -- phrase is "item 2 of", object is (get item 1 of item 4 of (get j of me))
set contents of r to "bb" -- Succeeds since total count is 1
log "Line 3: " & j
set j to {1, 2, {3, 4}, {{5, {6, 7}}, 8, 9}}
log "Line 4: " & j
set r to a reference to item 3 of j of me -- phrase is "item 3 of j of", object is (get me)
try
set contents of r to "cc" -- Fails since total count is 2
on error msg
log "Line 5: " & msg
end try
log "Line 6: " & j
set r to a reference to item 2 of item 1 of item 4 of j -- phrase is "item 2 of item 1 of item 4 of", object is (get j of me)
try
set contents of r to "dd" -- Fails since total count is 3
on error msg
log "Line 7: " & msg
end try
log "Line 8: " & j
日志输出如下所示。
(*Line 1: 123456789*)
(*Line 2: 12aa56789*)
(*Line 3: 12aa5bb89*)
(*Line 4: 123456789*)
(*Line 5: Can’t set item 3 of j to "cc".*)
(*Line 6: 123456789*)
(*Line 7: Can’t set item 2 of item 1 of item 4 of {1, 2, {3, 4}, {{5, {6, 7}}, 8, 9}} to "dd".*)
(*Line 8: 123456789*)
语句set contents of r to "bb”
有效,因为我在前一个语句中添加了显式get
。这是对象说明符的一部分forced early evaluation。
接下来,我想解答一个问题“你觉得你需要[使用参考文献]的背景是什么?”11月17日的调整问题。
最初,我试图找到一种方法让处理程序通过传递的参数返回两个值。一个工作示例如下所示。
set r to missing value
set s to missing value
FirstAndLast(a reference to r, a reference to s, "now is the time for all good men")
log r
log s
on FirstAndLast(alpha as reference, omega as reference, message as text)
set contents of alpha to first word of message
set contents of omega to last word of message
end FirstAndLast
执行此代码会生成日志输出:
(*now*)
(*men*)
上面显示的代码有两个缺点:1)变量r
和s
不能是本地的。 2)变量r
和s
必须在调用处理程序FirstAndLast
之前存在。在使用Applescript一段时间之后,我意识到有更好的方法来实现这段代码。一种方法是采用AppleScript Language Guide中描述的模式分配。使用模式分配的代码如下所示。
set {r, s} to FirstAndLast("now is the time for all good men")
log r
log s
on FirstAndLast(message as text)
set alpha to first word of message
set omega to last word of message
return {alpha, omega}
end FirstAndLast
这个版本有三个优点。 1)这里没有使用参考对象。 2)标识符r
和s
可以表示局部变量,全局变量或属性。 3)如果标识符r
和s
表示变量,则在调用处理程序FirstAndLast
之前不必存在变量。
最后,显然处理程序是对象。如果您认为我错了,请解释为什么执行以下操作。
on test()
log class of test as text
end test
property y : test
set x to test
log class of x as text
log class of y as text
x()
y()
答案 3 :(得分:0)
这不是原始问题的答案。这是对foo在12月1日发表的评论的回应。它是如何创建共享共同记录的同一个脚本男孩的两个实例的示例。此外,从foo的评论中学习,我使用记录与所有脚本实例共享属性。我不知道这是否是最好的方法,但至少没有全局。
script mom
property hair : "blond"
property shared : {address:"12 walnut st", phone:"555-1234"}
end script
script boy
property parent : mom
end script
script girl
property parent : mom
end script
on clone from old given shared:sharedSwitch as boolean : false
if sharedSwitch then
set shared to shared of old
set shared of old to missing value
end if
copy old to new
if sharedSwitch then
set shared of new to shared
set shared of old to shared
end if
return new
end clone
property myboy : clone from boy with shared
on run
log "mom hair is" & tab & tab & hair of mom
log "boy hair is " & tab & tab & hair of boy
log "girl hair is " & tab & tab & hair of girl
log "myboy hair is " & tab & hair of myboy
set hair of boy to "redhead"
log "**Set boy hair to redhead**"
log "mom hair is" & tab & tab & hair of mom
log "boy hair is " & tab & tab & hair of boy
log "girl hair is " & tab & tab & hair of girl
log "myboy hair is " & tab & hair of myboy
set hair of myboy to "flattop"
log "**Set myboy hair to flattop**"
log "mom hair is" & tab & tab & hair of mom
log "boy hair is " & tab & tab & hair of boy
log "girl hair is " & tab & tab & hair of girl
log "myboy hair is " & tab & hair of myboy
log
log "mom phone is" & tab & phone of shared of mom
log "boy phone is" & tab & phone of shared of boy
log "girl phone is" & tab & phone of shared of girl
log "myboy phone is" & tab & phone of shared of myboy
set phone of shared of myboy to "555-9999"
log "**Set myboy phone to 555-9999**"
log "mom phone is" & tab & phone of shared of mom
log "boy phone is" & tab & phone of shared of boy
log "girl phone is" & tab & phone of shared of girl
log "myboy phone is" & tab & phone of shared of myboy
end run