没有人知道为什么这个AppleScript的作品? 我不理解为什么。 该脚本生成包含相同的消息三个对话框:“你好”。 我有两个问题:
1)如何j和k被设置为引用i定义在我?
2)为什么不R参考在TEST2定义的我?
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。
您只能创建一个对象的属性或元素[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
处理程序示例工作,即使它看起来像它不应该。
是啊,这是怎样的一个janky语言。 但看看光明的一面:它比C指针headachey仍然较少。
基本上,你不想在你的脚本来创建“参考”。 存在于类,因为它是很常见的命令返回一个参考。 我能想到用它唯一的好处是,你可以创建一个对象的引用,没有对象被明确给出类和值。 然后,您可以稍后定义对象。
所以,你的样品中,您可以创建一个对象的引用,然后再创建它。
里面的test2的处理程序,一提到是全球范围内,所以看起来在标识为i的运行处理,而不是test2的处理程序中。
我真的建议在脚本中不使用它们。 什么是你觉得你需要的背景?
我觉得FOO回答11月18我的第二个问题,关于第一个问题,我会提出我自己的解释,这是我阅读后辨别对象说明符 。 下面的语句,从我的例子中所包含的隐式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
似乎有些武断。 让我说明一些例子我的观点。 (这里为简便起见,我省略了证明。如果读者(S)无法验证,让我知道,我将包括样张)
例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
短语中的保留关键字,由对象说明符包含的,必须等于统一。 共有零个或多个将导致脚本执行错误。 下面的例子说明这一点。
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
到先前的发言。这迫使早期评估的对象说明符的一部分。
接下来,我想谈谈这个问题:“什么是你觉得你需要[使用引用]上下文”的调整要求在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语言指南 。 使用图案分配的代码如下所示。
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()
这不是一个答案,原来的问题。 这是为了回应到foo的评论使12月1日,是如何创建相同的脚本小子的两个实例共享一个共同的记录的例子。 此外,从富的评论已经学会了,我用了一个记录所有的脚本实例共享的属性。 我不知道这是否是做的最好的办法,但至少没有全局。
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