如何定义之前,他们AppleScript的对象引用?(How can Applescript obj

2019-10-21 07:02发布

没有人知道为什么这个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。

Answer 1:

  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() 
  2. 一个隐性或显性内的所有变量run处理程序是全局的(另一种错误的特征),除非明确声明local 。 这两项错误特征的组合就是为什么你的run处理程序示例工作,即使它看起来像它不应该。

是啊,这是怎样的一个janky语言。 但看看光明的一面:它比C指针headachey仍然较少。



Answer 2:

基本上,你不想在你的脚本来创建“参考”。 存在于类,因为它是很常见的命令返回一个参考。 我能想到用它唯一的好处是,你可以创建一个对象的引用,没有对象被明确给出类和值。 然后,您可以稍后定义对象。

  1. 所以,你的样品中,您可以创建一个对象的引用,然后再创建它。

  2. 里面的test2的处理程序,一提到是全球范围内,所以看起来在标识为i的运行处理,而不是test2的处理程序中。

我真的建议在脚本中不使用它们。 什么是你觉得你需要的背景?



Answer 3:

我觉得FOO回答11月18我的第二个问题,关于第一个问题,我会提出我自己的解释,这是我阅读后辨别对象说明符 。 下面的语句,从我的例子中所包含的隐式of (get me)

return get a reference to i

为了说明这一点,我会明确地重写声明。

return get a reference to i of (get me)

当任一这些语句的执行,参考对象被创建,其包含一个对象说明符。 之间的短语a reference toget 评估,而不是将其存储在对象说明符。 在这种情况下,这句话是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

如果你想设置为一个对象的引用的内容,我发现下面的限制。 的数量inof短语中的保留关键字,由对象说明符包含的,必须等于统一。 共有零个或多个将导致脚本执行错误。 下面的例子说明这一点。

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)中的变量rs不能是本地的。 2)中的变量rs具有存在的处理程序之前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)识别符rs可以表示局部变量,全局变量或属性。 3)如果标识符rs代表变量,这些变量没有调用处理程序之前存在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()


Answer 4:

这不是一个答案,原来的问题。 这是为了回应到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


文章来源: How can Applescript objects be referenced before they are defined?